AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::vector< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only.
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h.
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote)
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsCrowdControlled () const
 
bool IsImmobilizedState () const
 
void SetAnimTier (AnimTier animTier)
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
bool IsClientControlled (Player const *exactClient=nullptr) const
 
Player const * GetClientControlling () const
 
float GetBoundaryRadius () const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinBoundaryRadius (const Unit *obj) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells.
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop()
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual void SetDualWieldMode (DualWieldMode mode)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (WeaponAttackType attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool RespondsToCallForHelp () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatFlatModifier (UnitMods unitMod, UnitModifierFlatType modifierType, float amount, bool apply)
 
void ApplyStatPctModifier (UnitMods unitMod, UnitModifierPctType modifierType, float amount)
 
void SetStatFlatModifier (UnitMods unitMod, UnitModifierFlatType modifierType, float val)
 
void SetStatPctModifier (UnitMods unitMod, UnitModifierPctType modifierType, float val)
 
float GetFlatModifierValue (UnitMods unitMod, UnitModifierFlatType modifierType) const
 
float GetPctModifierValue (UnitMods unitMod, UnitModifierPctType modifierType) const
 
void UpdateUnitMod (UnitMods unitMod)
 
virtual bool CheckAttackFitToAuraRequirement (WeaponAttackType, AuraEffect const *) const
 
virtual void UpdateDamageDoneMods (WeaponAttackType attackType, int32 skipEnchantSlot=-1)
 
void UpdateAllDamageDoneMods ()
 
void UpdateDamagePctDoneMods (WeaponAttackType attackType)
 
void UpdateAllDamagePctDoneMods ()
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void UpdateStatBuffMod (Stats stat)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
virtual bool HasActivePowerType (Powers power)
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
void SetResistance (SpellSchools school, int32 val)
 
void UpdateResistanceBuffModsMod (SpellSchools school)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void DealDamageShieldDamage (Unit *victim)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, bool npcCaster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
int32 GetHighestExclusiveSameEffectSpellGroupValue (AuraEffect const *aurEff, AuraType auraType, bool checkMiscValue=false, int32 miscValue=0) const
 
bool IsHighestExclusiveAura (Aura const *aura, bool removeOtherAuraApplications=false)
 
bool IsHighestExclusiveAuraEffect (SpellInfo const *spellInfo, AuraType auraType, int32 effectAmount, uint8 auraEffectMask, bool removeOtherAuraApplications=false)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura, bool owned)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras.
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras.
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras.
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype) const
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype, std::function< bool(AuraEffect const *)> const &predicate) const
 
float GetTotalAuraMultiplier (AuraType auraType, std::function< bool(AuraEffect const *)> const &predicate) const
 
int32 GetMaxPositiveAuraModifier (AuraType auraType, std::function< bool(AuraEffect const *)> const &predicate) const
 
int32 GetMaxNegativeAuraModifier (AuraType auraType, std::function< bool(AuraEffect const *)> const &predicate) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellGetFirstCurrentCastingSpell () const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool HasSpell (uint32) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (SpellInfo const *spellInfo, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
bool IsRooted () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanEnterWater () const =0
 
virtual bool CanSwim () const
 this method checks the current flag of a unit
 
bool CanFreeMove () const
 
bool HasLeewayMovement () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
void SetDisableGravity (bool disable)
 
virtual bool SetSwim (bool enable)
 
void SetCanFly (bool enable)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().
 
void SetWaterWalking (bool enable)
 
void SetFeatherFall (bool enable)
 
void SetHover (bool enable)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------—
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
bool IsStandUpOnMovementState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId)
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object, Milliseconds timed=0ms)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client.
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client.
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client.
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg) const
 -------—Pet responses methods--------------—
 
void SendPetActionSound (PetAction action) const
 
void SendPetDismissSound () const
 
void SendPetAIReaction (ObjectGuid guid) const
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
template<typename Worker >
void DoForAllVisiblePlayers (Worker &&worker)
 
template<typename Worker >
void DoForAllVisibleWorldObjects (Worker &&worker)
 
void DestroyForVisiblePlayers ()
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &gameobjectList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &creatureList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
VisibilityDistanceType GetVisibilityOverrideType () const
 
bool IsVisibilityOverridden () const
 
bool IsZoneWideVisible () const
 
bool IsFarVisible () const
 
float GetVisibilityOverrideDistance () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim.
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
virtual bool IsUpdateNeeded ()
 
bool CanBeAddedToMapUpdateList ()
 
std::string GetDebugInfo () const override
 
ObjectVisibilityContainerGetObjectVisibilityContainer ()
 
ObjectVisibilityContainer const & GetObjectVisibilityContainer () const
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
template<typename... T>
bool EntryEquals (T... entries) const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
bool operator!= (Position const &a) const
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
bool HasInLine (Position const *pos, float objSize, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
DualWieldMode _dualWieldMode
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ALEEventProcessor * ALEEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit ()
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool stun=false, bool logout=false)
 
void SendMoveRoot (bool state)
 
- Protected Member Functions inherited from WorldObject
 WorldObject ()
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsInvisibleDueToDespawn () const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraFlatModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_FLAT_END]
 
float m_auraPctModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_PCT_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
VisibilityDistanceType _visibilityDistanceOverrideType
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union { 
 
   int32 *   m_int32Values 
 
   uint32 *   m_uint32Values 
 
   float *   m_floatValues 
 
};  
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed?
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 
ValuesUpdateCache _valuesUpdateCache
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::vector<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
340{
341 // set current spells as deletable
342 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
343 if (m_currentSpells[i])
344 {
346 m_currentSpells[i] = nullptr;
347 }
348
350
351 delete i_motionMaster;
352 delete m_charmInfo;
353 delete movespline;
354
357 ASSERT(m_attackers.empty());
358
359 // pussywizard: clear m_sharedVision along with back references
360 if (!m_sharedVision.empty())
361 {
362 do
363 {
364 Player* p = *(m_sharedVision.begin());
365 p->m_isInSharedVisionOf.erase(this);
366 m_sharedVision.remove(p);
367 } while (!m_sharedVision.empty());
368 }
369
370 ASSERT(m_Controlled.empty());
371 ASSERT(m_appliedAuras.empty());
372 ASSERT(m_ownedAuras.empty());
373 ASSERT(m_removedAuras.empty());
374 ASSERT(m_gameObj.empty());
375 ASSERT(m_dynObj.empty());
376
377 if (m_movedByPlayer && m_movedByPlayer != this)
378 LOG_INFO("misc", "Unit::~Unit (A1)");
379
381}
std::uint8_t uint8
Definition Define.h:109
#define ASSERT
Definition Errors.h:68
#define LOG_INFO(filterType__,...)
Definition Log.h:166
#define CURRENT_MAX_SPELL
Definition Unit.h:551
Definition Player.h:1071
std::set< Unit * > m_isInSharedVisionOf
Definition Player.h:2349
void SetReferencedFromCurrent(bool yes)
Definition Spell.h:571
bool m_duringRemoveFromWorld
Definition Unit.h:2233
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition Unit.h:2146
AuraList m_removedAuras
Definition Unit.h:2150
ControlSet m_Controlled
Definition Unit.h:2057
Movement::MoveSpline * movespline
Definition Unit.h:2096
CharmInfo * m_charmInfo
Definition Unit.h:2168
MotionMaster * i_motionMaster
Definition Unit.h:2171
void _DeleteRemovedAuras()
Definition Unit.cpp:3860
DynObjectList m_dynObj
Definition Unit.h:2140
SafeUnitPointer m_movedByPlayer
Definition Unit.h:2059
AttackerSet m_attackers
Definition Unit.h:2132
Unit * m_attacking
Definition Unit.h:2133
GameObjectList m_gameObj
Definition Unit.h:2143
AuraMap m_ownedAuras
Definition Unit.h:2148
AuraApplicationMap m_appliedAuras
Definition Unit.h:2149
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition Unit.cpp:4385
SharedVisionList m_sharedVision
Definition Unit.h:2169

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( )
explicitprotected
206 : WorldObject(),
207 m_movedByPlayer(nullptr),
209 IsAIEnabled(false),
210 NeedChangeAI(false),
212 m_CreatedByPlayer(false),
214 i_AI(nullptr),
215 i_disabledAI(nullptr),
216 m_realRace(0),
217 m_race(0),
219 m_procDeep(0),
221 i_motionMaster(new MotionMaster(this)),
222 m_regenTimer(0),
223 m_ThreatMgr(this),
224 m_vehicle(nullptr),
225 m_vehicleKit(nullptr),
227 m_HostileRefMgr(this),
228 m_comboTarget(nullptr),
230{
231#ifdef _MSC_VER
232#pragma warning(default:4355)
233#endif
236
238
245
247
248 m_state = 0;
250
251 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
252 m_currentSpells[i] = nullptr;
253
254 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
255 m_SummonSlot[i].Clear();
256
257 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
258 m_ObjectSlot[i].Clear();
259
261
262 m_interruptMask = 0;
263 m_transform = 0;
264 m_canModifyStats = false;
265
266 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
267 m_spellImmune[i].clear();
268
269 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
270 {
275 }
276 // implement 50% base damage from offhand
278
279 for (uint8 i = 0; i < MAX_ATTACK; ++i)
280 {
283
284 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
285 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
286 }
287
288 for (uint8 i = 0; i < MAX_STATS; ++i)
289 m_createStats[i] = 0.0f;
290
291 m_attacking = nullptr;
292 m_modMeleeHitChance = 0.0f;
294 m_modSpellHitChance = 0.0f;
296
297 m_CombatTimer = 0;
298 m_lastManaUse = 0;
299
300 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
301 m_threatModifier[i] = 1.0f;
302
303 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
304 m_speed_rate[i] = 1.0f;
305
306 m_charmInfo = nullptr;
307
309
310 // remove aurastates allowing special moves
311 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
312 m_reactiveTimer[i] = 0;
313
314 m_cleanupDone = false;
316
318
319 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
324
325 m_applyResilience = false;
326 _instantCast = false;
327
328 _lastLiquid = nullptr;
329
330 _oldFactionId = 0;
331
332 _isWalkingBeforeCharm = false;
333
335}
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition ObjectGuid.h:49
@ SERVERSIDE_VISIBILITY_GHOST
Definition SharedDefines.h:1285
#define MAX_STATS
Definition SharedDefines.h:276
constexpr auto MAX_SPELL_SCHOOL
Definition SharedDefines.h:303
@ MAX_SUMMON_SLOT
Definition SharedDefines.h:3569
@ GHOST_VISIBILITY_ALIVE
Definition SharedDefines.h:1292
#define MAX_GAMEOBJECT_SLOT
Definition SharedDefines.h:3573
#define MAX_SPELL_IMMUNITY
Definition SharedDefines.h:1415
@ UNIT_MASK_NONE
Definition UnitDefines.h:155
#define MAX_MOVE_TYPE
Definition UnitDefines.h:364
@ BASE_VALUE
Definition Unit.h:128
@ TOTAL_VALUE
Definition Unit.h:129
@ MINDAMAGE
Definition Unit.h:142
@ MAXDAMAGE
Definition Unit.h:143
@ UNIT_MOD_DAMAGE_OFFHAND
Definition Unit.h:173
@ UNIT_MOD_END
Definition Unit.h:175
@ OFF_ATTACK
Definition Unit.h:217
@ MAX_ATTACK
Definition Unit.h:219
@ BASE_ATTACK
Definition Unit.h:216
@ RANGED_ATTACK
Definition Unit.h:218
#define BASE_MAXDAMAGE
Definition Unit.h:42
@ MAX_REACTIVE
Definition Unit.h:613
#define BASE_MINDAMAGE
Definition Unit.h:41
@ TOTAL_PCT
Definition Unit.h:136
@ BASE_PCT
Definition Unit.h:135
@ UPDATEFLAG_LIVING
Definition UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:45
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition Object.h:394
Definition MotionMaster.h:137
Definition MoveSpline.h:40
uint16 m_objectType
Definition Object.h:251
uint16 m_updateFlag
Definition Object.h:254
TypeID m_objectTypeId
Definition Object.h:253
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition Unit.h:2173
uint32 m_lastSanctuaryTime
Definition Unit.h:2073
LiquidTypeEntry const * _lastLiquid
Definition Unit.h:2184
uint32 m_transform
Definition Unit.h:2144
uint32 m_CombatTimer
Definition Unit.h:2216
bool m_canModifyStats
Definition Unit.h:2163
UnitAI * i_disabledAI
Definition Unit.h:2121
bool NeedChangeAI
Definition Unit.h:2080
uint32 m_state
Definition Unit.h:2215
int32 m_attackTimer[MAX_ATTACK]
Definition Unit.h:2128
float m_modAttackSpeedPct[3]
Definition Unit.h:2070
uint8 m_realRace
Definition Unit.h:2123
Vehicle * m_vehicle
Definition Unit.h:2180
uint8 m_race
Definition Unit.h:2124
UnitAI * i_AI
Definition Unit.h:2120
uint32 _lastExtraAttackSpell
Definition Unit.h:2238
bool _instantCast
Definition Unit.h:2188
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition Unit.h:2062
RedirectThreatInfo _redirectThreatInfo
Definition Unit.h:2230
float m_createStats[MAX_STATS]
Definition Unit.h:2130
float m_auraFlatModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_FLAT_END]
Definition Unit.h:2160
float m_modRangedHitChance
Definition Unit.h:2065
DeathState m_deathState
Definition Unit.h:2135
uint32 m_unitTypeMask
Definition Unit.h:2183
uint32 m_removedAurasCount
Definition Unit.h:2152
ThreatMgr m_ThreatMgr
Definition Unit.h:2176
Unit * m_comboTarget
Definition Unit.h:2226
AuraMap::iterator m_auraUpdateIterator
Definition Unit.h:2151
bool m_AutoRepeatFirstCast
Definition Unit.h:2126
uint16 m_delayed_unit_ai_notify_timer
Definition Unit.h:2092
int32 m_regenTimer
Definition Unit.h:2174
bool bRequestForcedVisibilityUpdate
Definition Unit.h:2093
bool m_ControlledByPlayer
Definition Unit.h:2082
uint32 m_last_notify_mstime
Definition Unit.h:2090
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition Unit.h:2072
int8 m_comboPoints
Definition Unit.h:2227
uint32 _oldFactionId
faction before charm
Definition Unit.h:2235
int32 m_baseSpellCritChance
Definition Unit.h:2067
float m_modMeleeHitChance
Definition Unit.h:2064
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition Unit.h:2162
Position m_last_notify_position
Definition Unit.h:2089
Vehicle * m_vehicleKit
Definition Unit.h:2181
bool IsAIEnabled
Definition Unit.h:2079
HostileRefMgr m_HostileRefMgr
Definition Unit.h:2222
DualWieldMode _dualWieldMode
Definition Unit.h:2055
bool m_applyResilience
Definition Unit.h:2187
uint32 m_interruptMask
Definition Unit.h:2158
int32 m_procDeep
Definition Unit.h:2137
float m_speed_rate[MAX_MOVE_TYPE]
Definition Unit.h:2166
float m_modSpellHitChance
Definition Unit.h:2066
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition Unit.h:2061
bool m_cleanupDone
Definition Unit.h:2232
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition Unit.h:2236
bool m_CreatedByPlayer
Definition Unit.h:2083
uint16 m_delayed_unit_relocation_timer
Definition Unit.h:2091
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition Unit.h:2069
uint32 m_lastManaUse
Definition Unit.h:2217
float m_auraPctModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_PCT_END]
Definition Unit.h:2161
WorldObject()
Definition Object.cpp:1032
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition Object.h:612
void Relocate(float x, float y)
Definition Position.h:77
Definition ThreatMgr.h:293

References _dualWieldMode, _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, Alive, AUTO, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraFlatModifiersGroup, m_auraPctModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inlineprivate
2211{ m_attackers.insert(pAttacker); }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4540{
4542 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4543
4544 _RemoveNoStackAurasDueToAura(aura, true);
4545
4546 if (aura->IsRemoved())
4547 return;
4548
4550 if (aura->IsSingleTarget())
4551 {
4552 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4553 /* @HACK: Player is not in world during loading auras.
4554 * Single target auras are not saved or loaded from database
4555 * but may be created as a result of aura links (player mounts with passengers)
4556 */
4557
4558 // register single target aura
4559 caster->GetSingleCastAuras().push_back(aura);
4560 // remove other single target auras
4561 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4562 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4563 {
4564 if ((*itr) != aura &&
4565 (*itr)->IsSingleTargetWith(aura))
4566 {
4567 (*itr)->Remove();
4568 itr = scAuras.begin();
4569 }
4570 else
4571 ++itr;
4572 }
4573 }
4574}
@ SPELL_AURA_CONTROL_VEHICLE
Definition SpellAuraDefines.h:299
ObjectGuid GetCasterGUID() const
Definition SpellAuras.h:105
bool IsRemoved() const
Definition SpellAuras.h:162
bool IsSingleTargetWith(Aura const *aura) const
Definition SpellAuras.cpp:1094
uint32 GetId() const
Definition SpellAuras.cpp:405
bool HasEffectType(AuraType type) const
Definition SpellAuras.cpp:1174
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition SpellAuras.h:167
bool IsSingleTarget() const
Definition SpellAuras.h:165
bool IsInWorld() const
Definition Object.h:108
ObjectGuid GetGUID() const
Definition Object.h:114
bool IsSingleTarget() const
Definition SpellInfo.cpp:1374
void _RemoveNoStackAurasDueToAura(Aura *aura, bool owned)
Definition Unit.cpp:4792
std::list< Aura * > AuraList
Definition Unit.h:672
bool IsDuringRemoveFromWorld() const
Definition Unit.h:693
AuraList & GetSingleCastAuras()
Definition Unit.h:1414

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5608{
5609 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5610 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5611}
@ AURA_EFFECT_HANDLE_STAT
Definition SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses(), and Player::GiveLevel().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4631{
4632 Aura* aura = aurApp->GetBase();
4633
4634 _RemoveNoStackAurasDueToAura(aura, false);
4635
4636 if (aurApp->GetRemoveMode())
4637 return;
4638
4639 Unit* caster = aura->GetCaster();
4640
4641 // Update target aura state flag
4642 SpellInfo const* spellInfo = aura->GetSpellInfo();
4643 if (AuraStateType aState = spellInfo->GetAuraState())
4644 {
4645 uint32 aStateMask = (1 << (aState - 1));
4646 // force update so the new caster registers it
4647 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4649 else
4650 ModifyAuraState(aState, true);
4651 }
4652
4653 if (aurApp->GetRemoveMode())
4654 return;
4655
4656 // Sitdown on apply aura req seated
4659
4660 if (aurApp->GetRemoveMode())
4661 return;
4662
4663 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4664
4665 // apply effects of the aura
4666 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4667 {
4668 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4669 aurApp->_HandleEffect(i, true);
4670 }
4671
4672 sScriptMgr->OnAuraApply(this, aura);
4673}
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1635
std::uint32_t uint32
Definition Define.h:107
#define sScriptMgr
Definition ScriptMgr.h:719
#define PER_CASTER_AURA_STATE_MASK
Definition SharedDefines.h:1329
AuraStateType
Definition SharedDefines.h:1299
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition SpellDefines.h:61
@ UNIT_STAND_STATE_SIT
Definition UnitDefines.h:33
@ UNIT_FIELD_AURASTATE
Definition UpdateFields.h:119
void _HandleEffect(uint8 effIndex, bool apply)
Definition SpellAuras.cpp:161
Aura * GetBase() const
Definition SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition SpellAuras.h:73
Definition SpellAuras.h:87
Unit * GetCaster() const
Definition SpellAuras.cpp:410
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition SpellAuras.cpp:1217
bool HasFlag(uint16 index, uint32 flag) const
Definition Object.cpp:871
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2070
Definition SpellInfo.h:316
AuraStateType GetAuraState() const
Definition SpellInfo.cpp:1951
uint32 AuraInterruptFlags
Definition SpellInfo.h:353
Definition Unit.h:655
void ModifyAuraState(AuraStateType flag, bool apply)
Definition Unit.cpp:10701
void SetStandState(uint8 state)
Definition Unit.cpp:16958
bool IsSitState() const
Definition Unit.cpp:16934

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4617{
4618 ASSERT(aura);
4619 ASSERT(aura->HasEffect(effIndex));
4621 ASSERT(aurApp);
4622 if (!aurApp->GetEffectMask())
4623 _ApplyAura(aurApp, 1 << effIndex);
4624 else
4625 aurApp->_HandleEffect(effIndex, true);
4626}
Definition SpellAuras.h:37
uint8 GetEffectMask() const
Definition SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition SpellAuras.h:174
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition SpellAuras.h:184
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition Unit.cpp:4630

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4579{
4580 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4582 // aura musn't be removed
4583 ASSERT(!aura->IsRemoved());
4584
4585 // aura mustn't be already applied on target
4586 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4587
4588 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4589 uint32 aurId = aurSpellInfo->Id;
4590
4591 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4592 // Xinef: Added IsAllowingDeadTarget check
4593 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading()))
4594 return nullptr;
4595
4596 Unit* caster = aura->GetCaster();
4597
4598 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4599 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4600
4601 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4602 // xinef: even if it gets removed, it will be reapplied in a second
4603 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4604 {
4605 m_interruptableAuras.push_back(aurApp);
4606 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4607 }
4608
4609 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4610 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4611
4612 aura->_ApplyForTarget(this, caster, aurApp);
4613 return aurApp;
4614}
WorldObject * GetOwner() const
Definition SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition SpellAuras.h:186
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:431
bool IsPlayer() const
Definition Object.h:200
Player * ToPlayer()
Definition Object.h:201
bool IsDeathPersistent() const
Definition SpellInfo.cpp:1217
uint32 Id
Definition SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition SpellInfo.cpp:1227
void AddInterruptMask(uint32 mask)
Definition Unit.h:1589
bool IsAlive() const
Definition Unit.h:1773
AuraApplicationList m_interruptableAuras
Definition Unit.h:2156
AuraStateAurasMap m_auraStateAuras
Definition Unit.h:2157

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Object::IsPlayer(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, and Object::ToPlayer().

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3861{
3862 while (!m_removedAuras.empty())
3863 {
3864 delete m_removedAuras.front();
3865 m_removedAuras.pop_front();
3866 }
3867}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19633{
19634 // Must be called only from aura handler
19635 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19636 return;
19637
19638 if (m_vehicle)
19639 {
19640 if (m_vehicle == vehicle)
19641 {
19642 if (seatId >= 0 && seatId != GetTransSeat())
19643 {
19644 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19645 ChangeSeat(seatId);
19646 }
19647
19648 return;
19649 }
19650 else
19651 {
19652 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19653 ExitVehicle();
19654 }
19655 }
19656
19657 if (!aurApp || aurApp->GetRemoveMode())
19658 return;
19659
19660 if (Player* player = ToPlayer())
19661 {
19662 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19663 return;
19664
19665 sScriptMgr->AnticheatSetUnderACKmount(player);
19666
19668 player->StopCastingCharm();
19669 player->StopCastingBindSight();
19670 Dismount();
19672
19673 // drop flag at invisible in bg
19674 if (Battleground* bg = player->GetBattleground())
19675 bg->EventPlayerDroppedFlag(player);
19676
19678 player->SendDirectMessage(&data);
19679 }
19680
19681 ASSERT(!m_vehicle);
19682 m_vehicle = vehicle;
19683
19684 if (!m_vehicle->AddPassenger(this, seatId))
19685 {
19686 m_vehicle = nullptr;
19687 return;
19688 }
19689
19690 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19692}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
@ SPELL_AURA_MOUNTED
Definition SpellAuraDefines.h:141
@ AURA_INTERRUPT_FLAG_MOVE
Definition SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition SpellDefines.h:47
Definition Battleground.h:294
uint32 GetEntry() const
Definition Object.h:116
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4176
void Dismount()
Definition Unit.cpp:13674
bool IsOnVehicle(Unit const *vehicle) const
Definition Unit.h:1906
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition Unit.cpp:5229
void ChangeSeat(int8 seatId, bool next=true)
Definition Unit.cpp:19694
Vehicle * GetVehicleKit() const
Definition Unit.h:1904
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition Unit.cpp:5300
void ExitVehicle(Position const *exitPosition=nullptr)
Definition Unit.cpp:19713
Unit * GetBase() const
May be called from scripts.
Definition Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition Vehicle.cpp:318
int8 GetTransSeat() const
Definition Object.h:688
Definition WorldPacket.h:26
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition Opcodes.h:1211

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), Object::IsPlayer(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19751{
19752 if (!m_vehicle)
19753 return;
19754
19755 // This should be done before dismiss, because there may be some aura removal
19758
19759 Player* player = ToPlayer();
19760
19761 // If player is on mouted duel and exits the mount should immediatly lose the duel
19762 if (player && player->duel && player->duel->IsMounted)
19763 player->DuelComplete(DUEL_FLED);
19764
19765 Vehicle* vehicle = m_vehicle;
19766 Unit* vehicleBase = m_vehicle->GetBase();
19767 m_vehicle = nullptr;
19768
19769 if (!vehicleBase)
19770 return;
19771
19772 if (IsPlayer())
19774
19775 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19776
19777 Position pos;
19778 // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it
19779 if (exitPosition)
19780 pos = *exitPosition;
19781 else
19782 {
19783 // Set exit position to vehicle position and use the current orientation
19784 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19785 pos.SetOrientation(vehicleBase->GetOrientation());
19786
19787 // Change exit position based on seat entry addon data
19788 if (seatAddon)
19789 {
19791 pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19793 pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19794 }
19795 }
19796
19798
19799 if (player)
19800 {
19802
19803 sScriptMgr->AnticheatSetUnderACKmount(player);
19804 }
19805
19806 // xinef: hack for flameleviathan seat vehicle
19807 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19808 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19809 {
19810 Movement::MoveSplineInit init(this);
19811 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19812 init.SetFacing(vehicleBase->GetOrientation());
19813 init.SetTransportExit();
19814 init.Launch();
19815 }
19816 else
19817 {
19818 float o = pos.GetAngle(this);
19819 Movement::MoveSplineInit init(this);
19820 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19821 init.SetFacing(GetOrientation());
19822 init.SetTransportExit();
19823 init.Launch();
19824 DisableSpline();
19825 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19827 }
19828
19829 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19830 if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19831 {
19833 }
19834
19835 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19836 if (((Minion*)vehicleBase)->GetOwner() == this)
19837 {
19838 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19839 {
19840 vehicle->Dismiss();
19841 }
19842 else if (vehicleBase->IsCreature())
19843 {
19844 vehicle->Uninstall();
19845 vehicleBase->m_Events.AddEventAtOffset(new VehicleDespawnEvent(*vehicleBase, 2s), 2s);
19846 }
19847
19848 // xinef: ugly hack, no appripriate hook later to cast spell
19849 if (player)
19850 {
19851 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19852 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19853 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19854 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19855 }
19856 }
19857
19859 {
19860 // Vehicle just died, we die too
19861 if (vehicleBase->getDeathState() == DeathState::JustDied)
19863 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19864 else
19865 ToTempSummon()->UnSummon(2s); // Approximation
19866 }
19867
19868 if (player)
19869 {
19871 player->SetCanTeleport(true);
19872 }
19873}
@ DELAYED_VEHICLE_TELEPORT
Definition Player.h:904
@ DUEL_FLED
Definition SharedDefines.h:3880
@ UNIT_MASK_ACCESSORY
Definition UnitDefines.h:165
@ UNIT_MASK_MINION
Definition UnitDefines.h:157
@ UNIT_STATE_ROOT
Definition UnitDefines.h:180
@ UNIT_STATE_MOVE
Definition UnitDefines.h:189
@ VEHICLE_SPELL_PARACHUTE
Definition VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition VehicleDefines.h:69
@ NPC_LITHE_STALKER
Definition VehicleDefines.h:70
void AddEventAtOffset(BasicEvent *event, Milliseconds offset, uint8 eventGroup=0)
Definition EventProcessor.h:108
Definition TemporarySummon.h:77
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:676
Definition MoveSplineInit.h:63
bool IsCreature() const
Definition Object.h:204
void SetCanTeleport(bool value)
Definition Player.h:2512
void DuelComplete(DuelCompleteType type)
Definition Player.cpp:6470
void SetFallInformation(uint32 time, float z)
Definition Player.h:2350
void SetExpectingChangeTransport(bool state)
Definition Player.h:2647
std::unique_ptr< DuelInfo > duel
Definition Player.h:1873
void ResummonPetTemporaryUnSummonedIfAny()
Definition Player.cpp:14277
uint32 GetDelayedOperations() const
Definition Player.h:2096
virtual void UnSummon(Milliseconds msTime=0ms)
Definition TemporarySummon.cpp:287
virtual void setDeathState(DeathState s, bool despawn=false)
Definition Unit.cpp:14658
Unit * GetOwner() const
Definition Unit.cpp:10804
DeathState getDeathState()
Definition Unit.h:1770
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition Unit.h:1738
TempSummon * ToTempSummon()
Definition Unit.h:721
void DisableSpline()
Definition Unit.cpp:637
void AddUnitState(uint32 f)
Definition Unit.h:725
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition Unit.cpp:18292
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1194
uint32 HasUnitTypeMask(uint32 mask) const
Definition Unit.h:731
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition Unit.cpp:19390
Definition Vehicle.h:101
Definition Vehicle.h:28
void Dismiss()
Definition Vehicle.cpp:541
VehicleEntry const * GetVehicleInfo() const
Definition Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition Vehicle.cpp:462
void Uninstall()
Definition Vehicle.cpp:101
VehicleSeatAddon const * GetSeatAddonForSeatOfPassenger(Unit const *passenger) const
Definition Vehicle.cpp:237
EventProcessor m_Events
Definition Object.h:730
Seconds GetGameTime()
Definition GameTime.cpp:38
Definition Position.h:27
void RelocateOffset(const Position &offset)
Definition Position.cpp:66
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
void SetOrientation(float orientation)
Definition Position.h:116
float GetPositionX() const
Definition Position.h:121
void GetPosition(float &x, float &y) const
Definition Position.h:126
float GetPositionY() const
Definition Position.h:122
float GetAngle(const Position *pos) const
Definition Position.cpp:85
Definition DBCStructure.h:2025
uint32 m_ID
Definition DBCStructure.h:2026
Definition VehicleDefines.h:86
float ExitParameterO
Definition VehicleDefines.h:96
float ExitParameterX
Definition VehicleDefines.h:93
float ExitParameterY
Definition VehicleDefines.h:94
float ExitParameterZ
Definition VehicleDefines.h:95
VehicleExitParameters ExitParameter
Definition VehicleDefines.h:97

References EventProcessor::AddEventAtOffset(), AddUnitState(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), VehicleSeatAddon::ExitParameter, VehicleSeatAddon::ExitParameterO, VehicleSeatAddon::ExitParameterX, VehicleSeatAddon::ExitParameterY, VehicleSeatAddon::ExitParameterZ, Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Vehicle::GetSeatAddonForSeatOfPassenger(), Vehicle::GetVehicleInfo(), HasUnitTypeMask(), Object::IsCreature(), Object::IsPlayer(), JustDied, KnockbackFrom(), Movement::MoveSplineInit::Launch(), WorldObject::m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Position::RelocateOffset(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Player::SetExpectingChangeTransport(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Position::SetOrientation(), Movement::MoveSplineInit::SetTransportExit(), sScriptMgr, Object::ToPlayer(), ToTempSummon(), Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, VEHICLE_SPELL_SHADE_CONTROL_END, VehicleExitParamDest, and VehicleExitParamOffset.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
14174{
14175 ASSERT(target);
14176
14177 // can assist to self
14178 if (this == target)
14179 return true;
14180
14181 // can't assist unattackable units or GMs
14182 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14183 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14184 return false;
14185
14186 // can't assist own vehicle or passenger
14187 if (m_vehicle)
14188 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14189 return false;
14190
14191 // can't assist invisible
14192 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14193 return false;
14194
14195 // can't assist dead
14196 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14197 return false;
14198
14199 // can't assist untargetable
14200 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14201 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14202 return false;
14203
14204 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14205 {
14206 // xinef: do not allow to assist non attackable units
14207 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14208 return false;
14209
14211 {
14212 if (target->IsImmuneToPC())
14213 return false;
14214 }
14215 else
14216 {
14217 if (target->IsImmuneToNPC())
14218 return false;
14219 }
14220 }
14221
14222 // can't assist non-friendly targets
14223 if (GetReactionTo(target) < REP_NEUTRAL
14224 && target->GetReactionTo(this) < REP_NEUTRAL
14225 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14226 return false;
14227
14228 // PvP case
14229 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14230 {
14231 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14233 {
14234 Player const* selfPlayerOwner = GetAffectingPlayer();
14235 if (selfPlayerOwner && targetPlayerOwner)
14236 {
14237 // can't assist player which is dueling someone
14238 if (selfPlayerOwner != targetPlayerOwner
14239 && targetPlayerOwner->duel)
14240 return false;
14241 }
14242 // can't assist player in ffa_pvp zone from outside
14243 if (target->IsFFAPvP() && !IsFFAPvP())
14244 return false;
14245
14246 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14247 if (target->IsPvP())
14248 if (IsInSanctuary() && !target->IsInSanctuary())
14249 return false;
14250 }
14251 }
14252 // PvC case - player can assist creature only if has specific type flags
14253 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14255 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14256 && !target->IsPvP())
14257 {
14258 if (Creature const* creatureTarget = target->ToCreature())
14259 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14260 }
14261 return true;
14262}
@ REP_NEUTRAL
Definition SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition SharedDefines.h:2732
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition SharedDefines.h:2718
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition SharedDefines.h:639
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition SharedDefines.h:628
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition SharedDefines.h:618
@ UNIT_STATE_UNATTACKABLE
Definition UnitDefines.h:211
@ UNIT_FLAG_NON_ATTACKABLE
Definition UnitDefines.h:255
@ UNIT_FLAG_NOT_SELECTABLE
Definition UnitDefines.h:279
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition UnitDefines.h:257
Definition Creature.h:47
Creature * ToCreature()
Definition Object.h:205
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition Unit.cpp:10243
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:737
bool IsInSanctuary() const
Definition Unit.h:1028
bool IsFFAPvP() const
Definition Unit.h:1030
Player * GetAffectingPlayer() const
Definition Unit.cpp:10829
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition Object.cpp:1726

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
14036{
14037 ASSERT(target);
14038
14039 // can't attack self
14040 if (this == target)
14041 return false;
14042
14043 // can't attack unattackable units or GMs
14044 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14045 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14046 return false;
14047
14048 // can't attack own vehicle or passenger
14049 if (m_vehicle)
14050 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14051 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
14052 return false;
14053
14054 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
14055 //Ignore stealth if target is player and unit in combat with same player
14056 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
14057 return false;
14058
14059 // can't attack dead
14060 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14061 return false;
14062
14063 // can't attack untargetable
14064 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14065 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14066 return false;
14067
14068 if (Player const* playerAttacker = ToPlayer())
14069 {
14070 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
14071 return false;
14072 }
14073 // check flags
14075 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
14076 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
14077 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
14078 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
14079 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
14080 return false;
14081
14082 // CvC case - can attack each other only when one of them is hostile
14084 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
14085
14086 // PvP, PvC, CvP case
14087 // can't attack friendly targets
14088 ReputationRank repThisToTarget = GetReactionTo(target);
14089 ReputationRank repTargetToThis;
14090
14091 if (repThisToTarget > REP_NEUTRAL
14092 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
14093 {
14094 // contested guards can attack contested PvP players even though players may be friendly
14095 if (!target->IsControlledByPlayer())
14096 return false;
14097
14098 bool isContestedGuard = false;
14099 if (FactionTemplateEntry const* entry = GetFactionTemplateEntry())
14100 isContestedGuard = entry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS;
14101
14102 bool isContestedPvp = false;
14103 if (Player const* player = target->GetCharmerOrOwnerPlayerOrPlayerItself())
14104 isContestedPvp = player->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP);
14105
14106 if (!isContestedGuard && !isContestedPvp)
14107 return false;
14108 }
14109
14110 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
14111 if (repThisToTarget == REP_NEUTRAL &&
14112 repTargetToThis <= REP_NEUTRAL)
14113 {
14114 Player* owner = GetAffectingPlayer();
14115 Unit const* const thisUnit = owner ? owner : this;
14116 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
14117 !(target->IsCreature() && thisUnit->IsCreature()))
14118 {
14119 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
14120 Unit const* creature = target->IsCreature() ? target : thisUnit;
14121
14122 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
14123 {
14124 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
14125 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
14126 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
14127 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
14128 return false;
14129 }
14130 }
14131 }
14132
14133 Creature const* creatureAttacker = ToCreature();
14134 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
14135 return false;
14136
14137 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
14138 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
14139
14140 // check duel - before sanctuary checks
14141 if (playerAffectingAttacker && playerAffectingTarget)
14142 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
14143 return true;
14144
14145 // PvP case - can't attack when attacker or target are in sanctuary
14146 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
14147 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
14148 return false;
14149
14150 // additional checks - only PvP case
14151 if (playerAffectingAttacker && playerAffectingTarget)
14152 {
14153 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
14154 return false;
14155
14156 if (target->IsPvP())
14157 return true;
14158
14159 if (IsFFAPvP() && target->IsFFAPvP())
14160 return true;
14161
14163 }
14164 return true;
14165}
@ FACTION_FLAG_AT_WAR
Definition DBCEnums.h:308
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition DBCEnums.h:331
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ TYPEMASK_DYNAMICOBJECT
Definition ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
@ DUEL_STATE_IN_PROGRESS
Definition Player.h:368
@ PLAYER_FLAGS_CONTESTED_PVP
Definition Player.h:476
@ PLAYER_FLAGS_UBER
Definition Player.h:487
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition SharedDefines.h:584
ReputationRank
Definition SharedDefines.h:179
@ REP_HOSTILE
Definition SharedDefines.h:181
@ UNIT_BYTE2_FLAG_UNK1
Definition UnitDefines.h:137
@ UNIT_FLAG_TAXI_FLIGHT
Definition UnitDefines.h:274
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition UnitDefines.h:270
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition UnitDefines.h:261
#define WORLD_TRIGGER
Definition Unit.h:39
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:208
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition Object.cpp:931
ReputationMgr & GetReputationMgr()
Definition Player.h:2123
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition ReputationMgr.h:81
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition ReputationMgr.h:106
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition Unit.cpp:10213
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Unit.cpp:10820
bool IsPvP() const
Definition Unit.h:1029
bool HasStealthAura() const
Definition Unit.h:1821
bool IsInCombatWith(Unit const *who) const
Definition Unit.cpp:21130
bool IsImmuneToNPC() const
Definition Unit.h:919
bool IsHostileTo(Unit const *unit) const
Definition Unit.cpp:10415
bool IsImmuneToPC() const
Definition Unit.h:917
bool IsInCombat() const
Definition Unit.h:924
uint32 type_flags
Definition CreatureData.h:223
Definition DBCStructure.h:907
Definition ReputationMgr.h:41
Definition DBCStructure.h:939

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), Vehicle::GetBase(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsControlledByPlayer(), Object::IsCreature(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_CONTESTED_PVP, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4816{
4817 if (apply)
4818 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4819 else
4820 m_modAuras[aurEff->GetAuraType()].erase(std::remove(m_modAuras[aurEff->GetAuraType()].begin(), m_modAuras[aurEff->GetAuraType()].end(), aurEff), m_modAuras[aurEff->GetAuraType()].end());
4821}
AuraType GetAuraType() const
Definition SpellAuraEffects.cpp:447
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition Unit.h:2154

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6346{
6347 m_dynObj.push_back(dynObj);
6348}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5602{
5603 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5604 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5605}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses(), and Player::GiveLevel().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inlineprivate
Note
: Call only in Unit::Attack()
2212{ m_attackers.erase(pAttacker); }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura,
bool  owned 
)
4793{
4794 //SpellInfo const* spellProto = aura->GetSpellInfo();
4795
4796 // passive spell special case (only non stackable with ranks)
4797
4798 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4799 // if (spellProto->IsPassiveStackableWithRanks())
4800 // return;
4801
4802 ASSERT(aura);
4803 if (!IsHighestExclusiveAura(aura))
4804 {
4805 aura->Remove();
4806 return;
4807 }
4808
4809 if (owned)
4810 RemoveOwnedAuras([aura](Aura const* ownedAura) { return !aura->CanStackWith(ownedAura); });
4811 else
4812 RemoveAppliedAuras([aura](AuraApplication const* appliedAura) { return !aura->CanStackWith(appliedAura->GetBase()); });
4813}
bool CanStackWith(Aura const *existingAura) const
Definition SpellAuras.cpp:1973
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition Unit.cpp:4989
void RemoveOwnedAuras(std::function< bool(Aura const *)> const &check)
Definition Unit.cpp:4976
bool IsHighestExclusiveAura(Aura const *aura, bool removeOtherAuraApplications=false)
Definition Unit.cpp:4434

References ASSERT, Aura::CanStackWith(), AuraApplication::GetBase(), IsHighestExclusiveAura(), Aura::Remove(), RemoveAppliedAuras(), and RemoveOwnedAuras().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4484{
4485 ASSERT(casterGUID || caster);
4486 if (!casterGUID)
4487 casterGUID = caster->GetGUID();
4488
4489 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4490 if (!newAura->IsMultiSlotAura())
4491 {
4492 // check if cast item changed
4493 ObjectGuid castItemGUID;
4494 if (castItem)
4495 castItemGUID = castItem->GetGUID();
4496
4497 // find current aura from spell and change it's stackamount, or refresh it's duration
4498 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4499 {
4500 // effect masks do not match
4501 // extremely rare case
4502 // let's just recreate aura
4503 if (effMask != foundAura->GetEffectMask())
4504 return nullptr;
4505
4506 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4507 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4508 {
4509 if (!foundAura->HasEffect(i))
4510 continue;
4511
4512 int bp;
4513 if (baseAmount)
4514 bp = *(baseAmount + i);
4515 else
4516 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4517
4518 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4519 *oldBP = bp;
4520 }
4521
4522 // correct cast item guid if needed
4523 if (castItemGUID != foundAura->GetCastItemGUID())
4524 {
4525 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4526 *oldGUID = castItemGUID;
4527 }
4528
4529 // try to increase stack amount
4530 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4531 sScriptMgr->OnAuraApply(this, foundAura);
4532 return foundAura;
4533 }
4534 }
4535
4536 return nullptr;
4537}
std::int32_t int32
Definition Define.h:103
@ AURA_REMOVE_BY_DEFAULT
Definition SpellAuraDefines.h:392
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition SpellInfo.h:198
Definition ObjectGuid.h:118
static ObjectGuid const Empty
Definition ObjectGuid.h:120
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition Unit.cpp:4879

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, and sScriptMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4772{
4773 // aura can be removed from unit only if it's applied on it, shouldn't happen
4774 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4775
4776 uint32 spellId = aurApp->GetBase()->GetId();
4777 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4778
4779 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4780 {
4781 if (iter->second == aurApp)
4782 {
4783 _UnapplyAura(iter, removeMode);
4784 return;
4785 }
4786 else
4787 ++iter;
4788 }
4789 ABORT();
4790}
#define ABORT
Definition Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition Unit.h:666
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition Unit.cpp:4676

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4677{
4678 AuraApplication* aurApp = i->second;
4679 ASSERT(aurApp);
4680 ASSERT(!aurApp->GetRemoveMode());
4681 ASSERT(aurApp->GetTarget() == this);
4682
4683 aurApp->SetRemoveMode(removeMode);
4684 Aura* aura = aurApp->GetBase();
4685 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4686
4687 // dead loop is killing the server probably
4688 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4689
4691
4692 Unit* caster = aura->GetCaster();
4693
4694 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4695 m_appliedAuras.erase(i);
4696
4697 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4698 // xinef: event if it gets removed, it will be reapplied in a second
4699 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4700 {
4701 m_interruptableAuras.remove(aurApp);
4703 }
4704
4705 bool auraStateFound = false;
4706 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4707 if (auraState)
4708 {
4709 bool canBreak = false;
4710 // Get mask of all aurastates from remaining auras
4711 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4712 {
4713 if (itr->second == aurApp)
4714 {
4715 m_auraStateAuras.erase(itr);
4716 itr = m_auraStateAuras.lower_bound(auraState);
4717 canBreak = true;
4718 continue;
4719 }
4720 auraStateFound = true;
4721 ++itr;
4722 }
4723 }
4724
4725 aurApp->_Remove();
4726 aura->_UnapplyForTarget(this, caster, aurApp);
4727
4728 // remove effects of the spell - needs to be done after removing aura from lists
4729 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4730 {
4731 if (aurApp->HasEffect(itr))
4732 aurApp->_HandleEffect(itr, false);
4733 }
4734
4735 // all effect mustn't be applied
4736 ASSERT(!aurApp->GetEffectMask());
4737
4738 // Remove totem at next update if totem loses its aura
4739 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4740 {
4741 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4743 }
4744
4745 // Remove aurastates only if needed and were not found
4746 if (auraState)
4747 {
4748 if (!auraStateFound)
4749 ModifyAuraState(auraState, false);
4750 else
4751 {
4752 // update for casters, some shouldn't 'see' the aura state
4753 uint32 aStateMask = (1 << (auraState - 1));
4754 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4756 }
4757 }
4758
4759 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4760
4761 // only way correctly remove all auras from list
4762 //if (removedAuras != m_removedAurasCount) new aura may be added
4763 i = m_appliedAuras.begin();
4764
4765 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4766
4767 if (this->ToCreature() && this->ToCreature()->IsAIEnabled)
4768 this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode);
4769}
@ AURA_REMOVE_BY_EXPIRE
Definition SpellAuraDefines.h:395
@ TOTEM_PASSIVE
Definition Totem.h:25
Unit * GetTarget() const
Definition SpellAuras.h:61
void SetRemoveMode(AuraRemoveMode mode)
Definition SpellAuras.h:72
void _Remove()
Definition SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:454
virtual void OnAuraRemove(AuraApplication *, AuraRemoveMode)
Definition CreatureAI.h:232
CreatureAI * AI() const
Definition Creature.h:145
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition TemporarySummon.cpp:395
Totem * ToTotem()
Definition Unit.h:720
void UpdateInterruptMask()
Definition Unit.cpp:768
bool IsTotem() const
Definition Unit.h:789

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), Creature::AI(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsAIEnabled, IsTotem(), JustDied, LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), CreatureAI::OnAuraRemove(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, Object::ToCreature(), TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6351{
6352 m_dynObj.remove(dynObj);
6353}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3928{
3929 SpellInfo const* spellProto = nullptr;
3931 {
3933 }
3934
3935 if (!spellProto)
3936 {
3937 return;
3938 }
3939
3940 static uint32 const HUNTER_AUTOSHOOT = 75;
3941
3942 // Check "realtime" interrupts
3943 if ((IsPlayer() && ToPlayer()->isMoving() && spellProto->Id != HUNTER_AUTOSHOOT) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3944 {
3945 // cancel wand shoot
3946 if (spellProto->Id != HUNTER_AUTOSHOOT)
3948 m_AutoRepeatFirstCast = true;
3949 return;
3950 }
3951
3952 // Apply delay (Hunter's autoshoot not affected)
3953 if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && spellProto->Id != HUNTER_AUTOSHOOT)
3954 {
3956 }
3957
3958 m_AutoRepeatFirstCast = false;
3959
3960 // Check for ranged attack timer
3962 {
3964 if (result != SPELL_CAST_OK)
3965 {
3966 if (spellProto->Id != HUNTER_AUTOSHOOT)
3967 {
3969 }
3970
3971 return;
3972 }
3973
3974 // We want to shoot
3975 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3976 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3977
3978 // Reset attack
3980 }
3981}
SpellCastResult
Definition SharedDefines.h:959
@ SPELL_CAST_OK
Definition SharedDefines.h:1149
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition SpellDefines.h:150
@ CURRENT_AUTOREPEAT_SPELL
Definition Unit.h:547
Definition Spell.h:295
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3403
SpellCastResult CheckCast(bool strict)
Definition Spell.cpp:5604
SpellInfo const *const m_spellInfo
Definition Spell.h:531
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4104
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition Unit.cpp:4146
void setAttackTimer(WeaponAttackType type, int32 time)
Definition Unit.h:875
bool isMoving() const
Definition Unit.h:1688
int32 getAttackTimer(WeaponAttackType type) const
Definition Unit.h:877
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition Unit.h:878
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition Unit.cpp:643

References Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), and TRIGGERED_FULL_MASK.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3870{
3873
3874 // remove finished spells from current pointers
3875 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3876 {
3877 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3878 {
3880 m_currentSpells[i] = nullptr; // remove pointer
3881 }
3882 }
3883
3884 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3886 {
3887 Aura* i_aura = m_auraUpdateIterator->second;
3888 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3889 i_aura->UpdateOwner(time, this);
3890 }
3891
3892 // remove expired auras - do that after updates(used in scripts?)
3893 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3894 {
3895 if (i->second->IsExpired())
3897 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3898 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3899 else
3900 ++i;
3901 }
3902
3903 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3904 if (itr->second->IsNeedClientUpdate())
3905 itr->second->ClientUpdate();
3906
3908
3909 if (!m_gameObj.empty())
3910 {
3911 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3912 {
3913 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3914 if (!go->isSpawned())
3915 {
3916 go->SetOwnerGUID(ObjectGuid::Empty);
3917 go->SetRespawnTime(0);
3918 go->Delete();
3919 m_gameObj.erase(itr++);
3920 continue;
3921 }
3922 ++itr;
3923 }
3924 }
3925}
@ AURA_REMOVE_BY_CANCEL
Definition SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition Spell.h:237
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition SpellAuras.cpp:698
Definition GameObject.h:120
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4824
void _UpdateAutoRepeatSpell()
Definition Unit.cpp:3927
VisibleAuraMap m_visibleAuras
Definition Unit.h:2164
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:184
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:115

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
19126{
19127 if (!spellInfo)
19128 return nullptr;
19129
19130 if (target->IsImmunedToSpell(spellInfo))
19131 return nullptr;
19132
19133 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
19134 {
19135 if (!(effMask & (1 << i)))
19136 continue;
19137 if (target->IsImmunedToSpellEffect(spellInfo, i))
19138 effMask &= ~(1 << i);
19139 }
19140
19141 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
19142 {
19143 aura->ApplyForTargets();
19144 return aura;
19145 }
19146 return nullptr;
19147}
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition SpellAuras.cpp:265
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition Unit.cpp:13172
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition Unit.cpp:13082

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
19111{
19112 if (!target)
19113 return nullptr;
19114
19115 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
19116 if (!spellInfo)
19117 return nullptr;
19118
19119 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
19120 return nullptr;
19121
19122 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
19123}
#define MAX_EFFECT_MASK
Definition DBCStructure.h:1636
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition SharedDefines.h:467
@ SPELL_ATTR0_PASSIVE
Definition SharedDefines.h:399
#define sSpellMgr
Definition SpellMgr.h:825
bool HasAttribute(SpellAttr0 attribute) const
Definition SpellInfo.h:415
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:19110

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), Player::ApplyItemDependentAuras(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pallid_horror::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_hadronox::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered_aura::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::Reset(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::SpellHitTarget(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
1008{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition Unit.h:2228

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
1005{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition Unit.cpp:17070

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
17071{
17072 if (!count)
17073 {
17074 return;
17075 }
17076
17077 if (target && target != m_comboTarget)
17078 {
17079 if (m_comboTarget)
17080 {
17082 }
17083
17084 m_comboTarget = target;
17085 m_comboPoints = count;
17086 target->AddComboPointHolder(this);
17087 }
17088 else
17089 {
17090 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
17091 }
17092
17094}
void SendComboPoints()
Definition Unit.cpp:17113
void AddComboPointHolder(Unit *unit)
Definition Unit.h:1008
void RemoveComboPointHolder(Unit *unit)
Definition Unit.h:1009

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2806{
2808 if (!targetGUID)
2809 {
2810 if (ObjectGuid selection = GetTarget())
2811 {
2812 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2813 }
2814 else
2815 return;
2816 }
2817
2818 extraAttacksTargets[targetGUID] += count;
2819}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition Unit.h:2239
ObjectGuid _lastDamagedTargetGuid
Definition Unit.h:2240
ObjectGuid GetTarget() const
Definition Unit.h:851

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
768{ m_movementInfo.flags2 |= f; }
MovementInfo m_movementInfo
Definition Object.h:692
uint16 flags2
Definition Object.h:291

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition Unit.h:2224

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6407{
6408 if (!gameObj || gameObj->GetOwnerGUID())
6409 return;
6410
6411 m_gameObj.push_back(gameObj->GetGUID());
6412 gameObj->SetOwnerGUID(GetGUID());
6413
6414 if (IsPlayer() && gameObj->GetSpellId())
6415 {
6416 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6417 // Need disable spell use for owner
6418 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6419 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6420 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6421 }
6422}
uint32 GetSpellId() const
Definition GameObject.h:181
void SetOwnerGUID(ObjectGuid owner)
Definition GameObject.h:163
ObjectGuid GetOwnerGUID() const
Definition GameObject.h:173
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition Player.cpp:10933
bool IsCooldownStartedOnEvent() const
Definition SpellInfo.cpp:1212

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), npc_midsummer_bonfire::Ignite(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
1589{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17542{
17543 if (!IsPlayer())
17544 return;
17545
17546 m_petAuras.insert(petSpell);
17547 if (Pet* pet = ToPlayer()->GetPet())
17548 pet->CastPetAura(petSpell);
17549 else if (Unit* charm = GetCharm())
17550 charm->CastPetAura(petSpell);
17551}
Definition Pet.h:41
Unit * GetCharm() const
Definition Unit.cpp:10875
PetAuraSet m_petAuras
Definition Unit.h:2077
Pet * GetPet(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:215

References GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11378{
11379 if (m_sharedVision.empty())
11380 setActive(true);
11381
11382 m_sharedVision.push_back(player);
11383 player->m_isInSharedVisionOf.insert(this);
11384}
void setActive(bool isActiveObject)
Definition Object.cpp:1058

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
2000{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition Unit.h:2086

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14759{
14760 // Only mobs can manage threat lists
14762 {
14763 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14764 }
14765}
@ UNIT_STATE_EVADE
Definition UnitDefines.h:191
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition ThreatMgr.cpp:436
bool HasUnitState(const uint32 f) const
Definition Unit.h:726
bool CanHaveThreatList(bool skipAliveCheck=false) const
Definition Unit.cpp:14719

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_zuljin_vortex::ChangeToNewPlayer(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_dark_fiend::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::Reset(), boss_dalronn_the_controller::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_romulo::ScheduleCombat(), npc_thaladred::ScheduleEvents(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), boss_supremus::SchedulePhase(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), boss_eck::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), npc_molten_golem::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from Object.

15910{
15911 if (!IsInWorld())
15912 {
15914 }
15915}
void AddToWorld() override
Definition Object.cpp:1190

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
725{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), boss_lady_vashj::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), SetRooted(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
732{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17292{
17294
17295 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17296 if (val > 0.f)
17297 {
17299 ApplyPercentModFloatVar(amount, val, !apply);
17300 }
17301 else
17302 {
17304 ApplyPercentModFloatVar(amount, -val, apply);
17305 }
17307 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17308}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition Unit.cpp:17286
@ UNIT_FIELD_BASEATTACKTIME
Definition UpdateFields.h:120
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:610
float GetFloatValue(uint16 index) const
Definition Object.cpp:306
void SetFloatValue(uint16 index, float value)
Definition Object.cpp:726
uint32 GetAttackTime(WeaponAttackType att) const
Definition Unit.h:904

References ApplyPercentModFloatVar(), AsUnderlyingType(), GetAttackTime(), Object::GetFloatValue(), m_attackTimer, m_modAttackSpeedPct, Object::SetFloatValue(), and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
17311{
17312 float amount = GetFloatValue(UNIT_MOD_CAST_SPEED);
17313
17314 if (val > 0.f)
17315 ApplyPercentModFloatVar(amount, val, !apply);
17316 else
17317 ApplyPercentModFloatVar(amount, -val, apply);
17318
17320}
@ UNIT_MOD_CAST_SPEED
Definition UpdateFields.h:137

References ApplyPercentModFloatVar(), Object::GetFloatValue(), Object::SetFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15232{
15233 // Checking for existing in the table
15234 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15235 {
15236 if (i->DRGroup != group)
15237 continue;
15238
15239 if (apply)
15240 i->stack += 1;
15241 else if (i->stack)
15242 {
15243 i->stack -= 1;
15244 // Remember time after last aura from group removed
15245 if (i->stack == 0)
15246 i->hitTime = GameTime::GetGameTimeMS().count();
15247 }
15248 break;
15249 }
15250}
Diminishing m_Diminishing
Definition Unit.h:2220
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
15153{
15154 // xinef: dont apply diminish to self casts
15155 if (duration == -1 || group == DIMINISHING_NONE)
15156 return 1.0f;
15157
15158 // test pet/charm masters instead pets/charmeds
15159 Unit const* targetOwner = GetOwner();
15160 Unit const* casterOwner = caster->GetOwner();
15161
15162 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15163 if (limitduration > 0 && duration > limitduration)
15164 {
15165 Unit const* target = targetOwner ? targetOwner : this;
15166 Unit const* source = casterOwner ? casterOwner : caster;
15167
15168 if ((target->IsPlayer()
15170 && source->IsPlayer())
15171 duration = limitduration;
15172 }
15173
15174 float mod = 1.0f;
15175
15176 if (group == DIMINISHING_TAUNT)
15177 {
15179 {
15180 DiminishingLevels diminish = Level;
15181 switch (diminish)
15182 {
15184 break;
15186 mod = 0.65f;
15187 break;
15189 mod = 0.4225f;
15190 break;
15192 mod = 0.274625f;
15193 break;
15195 mod = 0.0f;
15196 break;
15197 default:
15198 break;
15199 }
15200 }
15201 }
15202 // Some diminishings applies to mobs too (for example, Stun)
15204 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15205 || (IsCreature() && ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_ALL_DIMINISH))))
15207 {
15208 DiminishingLevels diminish = Level;
15209 switch (diminish)
15210 {
15212 break;
15214 mod = 0.5f;
15215 break;
15217 mod = 0.25f;
15218 break;
15220 mod = 0.0f;
15221 break;
15222 default:
15223 break;
15224 }
15225 }
15226
15227 duration = int32(duration * mod);
15228 return mod;
15229}
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition CreatureData.h:64
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition CreatureData.h:65
@ Level
Requires the player to be at least a specific level.
@ DIMINISHING_NONE
Definition SharedDefines.h:3508
@ DIMINISHING_TAUNT
Definition SharedDefines.h:3526
@ DRTYPE_PLAYER
Definition SharedDefines.h:3501
@ DRTYPE_ALL
Definition SharedDefines.h:3502
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition SpellMgr.cpp:242
DiminishingLevels
Definition Unit.h:269
@ DIMINISHING_LEVEL_3
Definition Unit.h:272
@ DIMINISHING_LEVEL_1
Definition Unit.h:270
@ DIMINISHING_LEVEL_4
Definition Unit.h:274
@ DIMINISHING_LEVEL_IMMUNE
Definition Unit.h:273
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition Unit.h:275
@ DIMINISHING_LEVEL_2
Definition Unit.h:271
bool HasFlagsExtra(uint32 flag) const
Definition Creature.h:77

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, GetDiminishingReturnsGroupType(), GetOwner(), Creature::HasFlagsExtra(), Object::IsCreature(), Object::IsPlayer(), Level, and Object::ToCreature().

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14935{
14936 if (Player* modOwner = GetSpellModOwner())
14937 {
14938 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14939 switch (effect_index)
14940 {
14941 case 0:
14942 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14943 break;
14944 case 1:
14945 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14946 break;
14947 case 2:
14948 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14949 break;
14950 }
14951 }
14952 return value;
14953}
@ SPELLMOD_EFFECT2
Definition SpellDefines.h:88
@ SPELLMOD_ALL_EFFECTS
Definition SpellDefines.h:84
@ SPELLMOD_EFFECT3
Definition SpellDefines.h:99
@ SPELLMOD_EFFECT1
Definition SpellDefines.h:79
Player * GetSpellModOwner() const
Definition Unit.cpp:16794

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
19175{
19176 // player mounted on multi-passenger mount is also classified as vehicle
19177 if (victim->IsVehicle() && !victim->IsPlayer())
19178 return;
19179
19180 Unit const* target = nullptr;
19181 if (victim->IsPlayer())
19182 target = victim;
19183 else if (victim->IsCreature())
19184 {
19185 if (Unit* owner = victim->GetOwner())
19186 if (owner->IsPlayer())
19187 target = owner;
19188 }
19189
19190 if (!target)
19191 return;
19192
19193 switch (type)
19194 {
19196 // Crit chance reduction works against nonpets
19197 if (crit)
19198 *crit -= target->GetMeleeCritChanceReduction();
19199 if (damage)
19200 {
19201 if (isCrit)
19202 *damage -= target->GetMeleeCritDamageReduction(*damage);
19203 *damage -= target->GetMeleeDamageReduction(*damage);
19204 }
19205 break;
19207 // Crit chance reduction works against nonpets
19208 if (crit)
19209 *crit -= target->GetRangedCritChanceReduction();
19210 if (damage)
19211 {
19212 if (isCrit)
19213 *damage -= target->GetRangedCritDamageReduction(*damage);
19214 *damage -= target->GetRangedDamageReduction(*damage);
19215 }
19216 break;
19218 // Crit chance reduction works against nonpets
19219 if (crit)
19220 *crit -= target->GetSpellCritChanceReduction();
19221 if (damage)
19222 {
19223 if (isCrit)
19224 *damage -= target->GetSpellCritDamageReduction(*damage);
19225 *damage -= target->GetSpellDamageReduction(*damage);
19226 }
19227 break;
19228 default:
19229 break;
19230 }
19231}
@ CR_CRIT_TAKEN_RANGED
Definition Unit.h:239
@ CR_CRIT_TAKEN_SPELL
Definition Unit.h:240
@ CR_CRIT_TAKEN_MELEE
Definition Unit.h:238
float GetSpellCritChanceReduction() const
Definition Unit.h:1257
float GetRangedCritChanceReduction() const
Definition Unit.h:1256
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition Unit.h:1261
float GetMeleeCritChanceReduction() const
Definition Unit.h:1255
uint32 GetRangedDamageReduction(uint32 damage) const
Definition Unit.h:1249
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition Unit.h:1260
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition Unit.h:1259
uint32 GetSpellDamageReduction(uint32 damage) const
Definition Unit.h:1250
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition Unit.h:1248

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::IsCreature(), Object::IsPlayer(), and IsVehicle().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetUnitCriticalChance(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and SpellTakenCritChance().

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13566{
13567 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13568
13569 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13570 {
13571 // Create dispel mask by dispel type
13572 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13573 // Dispel all existing auras vs current dispel type
13575 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13576 {
13577 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13578 if (spell->GetDispelMask() & dispelMask)
13579 {
13580 // Dispel aura
13581 RemoveAura(itr);
13582 }
13583 else
13584 ++itr;
13585 }
13586 }
13587}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition SharedDefines.h:445
@ IMMUNITY_DISPEL
Definition SharedDefines.h:1409
uint32 GetDispelMask() const
Definition SpellInfo.cpp:1932
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition Unit.cpp:13538
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4895
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:664
AuraApplicationMap & GetAppliedAuras()
Definition Unit.h:1368

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13539{
13540 if (apply)
13541 {
13542 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13543 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13544 return;
13545
13546 SpellImmune immune;
13547 immune.spellId = spellId;
13548 immune.type = type;
13549 immune.blockType = blockType;
13550 m_spellImmune[op].push_back(std::move(immune));
13551 }
13552 else
13553 {
13554 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13555 {
13556 if (itr->spellId == spellId && itr->type == type)
13557 {
13558 m_spellImmune[op].erase(itr);
13559 break;
13560 }
13561 }
13562 }
13563}
Definition Unit.cpp:13529
Definition SpellDefines.h:174
uint32 blockType
Definition SpellDefines.h:179
uint32 spellId
Definition SpellDefines.h:177
uint32 type
Definition SpellDefines.h:178

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_army_of_the_dead_passive::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_pet_intellect_spirit_resilience_scaling::HandleEffectApply(), spell_pet_spellhit_expertise_spellpen_scaling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_illidan_shadow_prison_aura::HandleOnEffectApply(), spell_illidan_shadow_prison_aura::HandleOnEffectRemove(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), boss_hydross_the_unstable::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_necrotic_shard::npc_necrotic_shard(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::npc_ulduar_arachnopod_destroyerAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::Reset(), npc_sanguine_spirit::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::boss_auriayaAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_supremus::Reset(), boss_kaelthas::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), and Creature::UpdateEntry().

◆ ApplyStatPctModifier()

void Unit::ApplyStatPctModifier ( UnitMods  unitMod,
UnitModifierPctType  modifierType,
float  amount 
)
15340{
15341 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_PCT_END)
15342 {
15343 LOG_ERROR("entities.unit", "ERROR in ApplyStatPctModifier(): non-existing UnitMods or wrong UnitModifierType!");
15344 return;
15345 }
15346
15347 if (!pct)
15348 return;
15349
15350 switch (modifierType)
15351 {
15352 case BASE_PCT:
15353 case TOTAL_PCT:
15354 AddPct(m_auraPctModifiersGroup[unitMod][modifierType], pct);
15355 break;
15356 default:
15357 break;
15358 }
15359
15360 UpdateUnitMod(unitMod);
15361}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ MODIFIER_TYPE_PCT_END
Definition Unit.h:137
T AddPct(T &base, U pct)
Definition Util.h:58
void UpdateUnitMod(UnitMods unitMod)
Definition Unit.cpp:15403

References AddPct(), BASE_PCT, LOG_ERROR, m_auraPctModifiersGroup, MODIFIER_TYPE_PCT_END, TOTAL_PCT, UNIT_MOD_END, and UpdateUnitMod().

Referenced by boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleModPercentStat(), spell_astromancer_solarian_transform::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14747{
14748 if (!HasThreatAura() || fThreat < 0)
14749 return fThreat;
14750
14751 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14752
14753 return fThreat * m_threatModifier[school];
14754}
SpellSchools
Definition SharedDefines.h:293
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition SharedDefines.h:329
bool HasThreatAura() const
Definition Unit.h:1811

References GetFirstSchoolInMask(), HasThreatAura(), and m_threatModifier.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10452{
10453 if (!victim || victim == this)
10454 return false;
10455
10456 // dead units can neither attack nor be attacked
10457 if (!IsAlive() || !victim->IsAlive())
10458 return false;
10459
10460 // pussywizard: check map, world, phase >_> multithreading crash fix
10461 if (!IsInMap(victim) || !InSamePhase(victim))
10462 return false;
10463
10464 // player cannot attack in mount state
10465 if (IsPlayer() && IsMounted())
10466 return false;
10467
10468 // creatures cannot attack while evading
10469 Creature* creature = ToCreature();
10470 if (creature && creature->IsInEvadeMode())
10471 {
10472 return false;
10473 }
10474
10475 // creatures should not try to attack the player during polymorph
10476 if (creature && creature->IsPolymorphed())
10477 {
10478 return false;
10479 }
10480
10481 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10482 // return false;
10483
10484 // nobody can attack GM in GM-mode
10485 if (victim->IsPlayer())
10486 {
10487 if (victim->ToPlayer()->IsGameMaster())
10488 return false;
10489 }
10490 else
10491 {
10492 if (victim->ToCreature()->IsEvadingAttacks())
10493 return false;
10494 }
10495
10496 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10498 return false;
10499
10500 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10501 if (HasUnattackableAura())
10503
10504 if (m_attacking)
10505 {
10506 if (m_attacking == victim)
10507 {
10508 // switch to melee attack from ranged/magic
10509 if (meleeAttack)
10510 {
10512 {
10514 SendMeleeAttackStart(victim);
10515 return true;
10516 }
10517 }
10519 {
10521 SendMeleeAttackStop(victim);
10522 return true;
10523 }
10524 return false;
10525 }
10526
10527 // switch target
10528 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10529 if (!meleeAttack)
10531 }
10532
10533 if (m_attacking)
10535
10536 m_attacking = victim;
10538
10539 // Set our target
10540 SetTarget(victim->GetGUID());
10541
10542 if (meleeAttack)
10544
10545 Unit* owner = GetCharmerOrOwner();
10546 Creature* ownerCreature = owner ? owner->ToCreature() : nullptr;
10547 Creature* controlledCreatureWithSameVictim = nullptr;
10548 if (creature && !m_Controlled.empty())
10549 {
10550 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10551 {
10552 if ((*itr)->ToCreature() && (*itr)->GetVictim() == victim)
10553 {
10554 controlledCreatureWithSameVictim = (*itr)->ToCreature();
10555 break;
10556 }
10557 }
10558 }
10559
10560 // Share leash timer with controlled unit
10561 if (controlledCreatureWithSameVictim)
10562 creature->SetLastLeashExtensionTimePtr(controlledCreatureWithSameVictim->GetLastLeashExtensionTimePtr());
10563 // Share leash timer with owner
10564 else if (creature && ownerCreature && ownerCreature->GetVictim() == victim)
10566 // Update leash timer when attacking creatures
10567 else if (victim->IsCreature())
10569
10570 // set position before any AI calls/assistance
10571 //if (IsCreature())
10572 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10573 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10574 {
10575 // should not let player enter combat by right clicking target - doesn't helps
10576 SetInCombatWith(victim);
10577 if (victim->IsPlayer())
10578 victim->SetInCombatWith(this);
10579
10580 AddThreat(victim, 0.0f);
10581
10583
10586 creature->CallAssistance();
10587
10589
10591 }
10592
10593 // delay offhand weapon attack by 50% of the base attack time
10596
10597 if (meleeAttack)
10598 SendMeleeAttackStart(victim);
10599
10600 return true;
10601}
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition CreatureData.h:70
@ EMOTE_ONESHOT_NONE
Definition SharedDefines.h:1905
@ AI_REACTION_HOSTILE
Definition SharedDefines.h:3492
@ SPELL_AURA_MOD_UNATTACKABLE
Definition SpellAuraDefines.h:156
@ UNIT_STATE_MELEE_ATTACKING
Definition UnitDefines.h:171
@ CURRENT_MELEE_SPELL
Definition Unit.h:544
@ UNIT_NPC_EMOTESTATE
Definition UpdateFields.h:140
T CalculatePct(T base, U pct)
Definition Util.h:52
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition WorldConfig.h:237
void CallAssistance(Unit *target=nullptr)
Definition Creature.cpp:2433
bool IsEvadingAttacks() const
Definition Creature.h:140
std::shared_ptr< time_t > const & GetLastLeashExtensionTimePtr() const
Definition Creature.cpp:3581
void UpdateLeashExtensionTime()
Definition Creature.cpp:3603
void SetAssistanceTimer(uint32 value)
Definition Creature.h:411
void SetLastLeashExtensionTimePtr(std::shared_ptr< time_t > const &timer)
Definition Creature.cpp:3588
void SendAIReaction(AiReaction reactionType)
Definition Creature.cpp:2421
bool IsInEvadeMode() const
Definition Creature.h:139
bool IsGameMaster() const
Definition Player.h:1161
bool HasOffhandWeaponForAttack() const
Definition Unit.h:975
void ClearUnitState(uint32 f)
Definition Unit.h:727
bool IsPolymorphed() const
Definition Unit.cpp:16973
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition Unit.cpp:14758
void _removeAttacker(Unit *pAttacker)
Definition Unit.h:2212
void _addAttacker(Unit *pAttacker)
Definition Unit.h:2211
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition Unit.cpp:13732
bool HasUnattackableAura() const
Definition Unit.h:1813
Unit * GetCharmerOrOwner() const
Definition Unit.h:1271
bool IsMounted() const
Definition Unit.h:1866
Unit * GetVictim() const
Definition Unit.h:893
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition Unit.cpp:3099
bool IsControllableGuardian() const
Definition Unit.h:786
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:21414
void SendMeleeAttackStop(Unit *victim=nullptr)
Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or int...
Definition Unit.cpp:3115
bool IsControlledByPlayer() const
Definition Unit.h:1292
bool HasSpiritOfRedemptionAura() const
Definition Unit.h:1784
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0
bool InSamePhase(WorldObject const *obj) const
Definition Object.h:513
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1311
#define sWorld
Definition World.h:316

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, BASE_ATTACK, CalculatePct(), Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, getAttackTimer(), GetCharmerOrOwner(), Object::GetFloatValue(), Object::GetGUID(), Creature::GetLastLeashExtensionTimePtr(), GetVictim(), Creature::HasFlagsExtra(), HasOffhandWeaponForAttack(), HasSpiritOfRedemptionAura(), HasUnattackableAura(), HasUnitState(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, m_Controlled, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), Creature::SetLastLeashExtensionTimePtr(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_BASEATTACKTIME, UNIT_NPC_EMOTESTATE, UNIT_STATE_MELEE_ATTACKING, and Creature::UpdateLeashExtensionTime().

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_kologarn::boss_kologarnAI::AttackStart(), boss_mimiron::boss_mimironAI::AttackStart(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), boss_halazzi::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2602{
2604 {
2605 return;
2606 }
2607
2608 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2609 {
2610 return;
2611 }
2612
2613 if (!victim->IsAlive())
2614 return;
2615
2616 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2617 return;
2618
2619 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2620 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2621
2622 CombatStart(victim);
2624
2625 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2626 return; // ignore ranged case
2627
2628 if (!extra && _lastExtraAttackSpell)
2629 {
2631 }
2632
2633 bool meleeAttack = true;
2634
2635 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2636 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2637 {
2638 meleeAttack = false; // The melee attack is replaced by the melee spell
2639
2641 SpellCastResult castResult = meleeSpell->CheckCast(false);
2642 if (castResult != SPELL_CAST_OK)
2643 {
2644 meleeSpell->SendCastResult(castResult);
2645 meleeSpell->SendInterrupted(0);
2646
2647 meleeSpell->finish(false);
2648 meleeSpell->SetExecutedCurrently(false);
2649
2650 if (castResult == SPELL_FAILED_NO_POWER)
2651 {
2652 // Not enough rage, do a regular melee attack instead
2653 meleeAttack = true;
2654 }
2655 }
2656 else
2657 {
2658 meleeSpell->cast(true);
2659 }
2660 }
2661 if (meleeAttack)
2662 {
2663 // attack can be redirected to another target
2664 victim = GetMeleeHitRedirectTarget(victim);
2665 CalcDamageInfo damageInfo;
2666 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2667
2668 // Send log damage message to client
2669 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2670 {
2671 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2672 }
2673
2674 // Related to sparring system. Allow attack animations even if there are no damages
2675 if (victim->CanSparringWith(damageInfo.attacker))
2676 damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
2677
2678 SendAttackStateUpdate(&damageInfo);
2679
2680 //TriggerAurasProcOnEvent(damageInfo);
2681
2682 _lastDamagedTargetGuid = victim->GetGUID();
2683
2684 DealMeleeDamage(&damageInfo, true);
2685
2686 DamageInfo dmgInfo(damageInfo);
2687 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2688 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2689
2690 if (IsPlayer())
2691 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2692 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2693 else
2694 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2695 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2696
2697 // Let the pet know we've started attacking someting. Handles melee attacks only
2698 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2699 if (IsPlayer() && !m_Controlled.empty())
2700 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2701 if (Unit* pet = *itr)
2702 if (pet->IsAlive() && pet->IsCreature())
2703 pet->ToCreature()->AI()->OwnerAttacked(victim);
2704 }
2705}
#define MAX_ITEM_PROTO_DAMAGES
Definition ItemTemplate.h:613
@ SPELL_FAILED_NO_POWER
Definition SharedDefines.h:1045
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition SpellDefines.h:55
@ UNIT_STAND_STATE_SLEEP
Definition UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition UnitDefines.h:218
@ UNIT_FLAG_PACIFIED
Definition UnitDefines.h:271
@ HITINFO_FAKE_DAMAGE
Definition Unit.h:123
Definition Unit.h:337
std::string ToString() const
Definition ObjectGuid.cpp:47
void cast(bool skipCheck=false)
Definition Spell.cpp:3721
void SetExecutedCurrently(bool yes)
Definition Spell.h:573
void SendInterrupted(uint8 result)
Definition Spell.cpp:5124
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition Spell.cpp:4619
void finish(bool ok=true)
Definition Spell.cpp:4427
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition Unit.cpp:6706
void CombatStart(Unit *target, bool initialAggro=true)
Definition Unit.cpp:13777
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition Unit.cpp:11265
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition Unit.cpp:1496
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:6605
uint8 getStandState() const
Definition Unit.h:1760
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition Unit.cpp:1861
bool CanSparringWith(Unit const *attacker) const
Definition Unit.cpp:3983
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition Unit.cpp:814
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition Object.cpp:1373
Definition Unit.h:470
uint32 procAttacker
Definition Unit.h:487
uint32 procVictim
Definition Unit.h:488
uint32 absorb
Definition Unit.h:478
struct CalcDamageInfo::@267 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 damage
Definition Unit.h:477
uint32 procEx
Definition Unit.h:489
uint32 HitInfo
Definition Unit.h:483
Unit * attacker
Definition Unit.h:471
Unit * target
Definition Unit.h:472
WeaponAttackType attackType
Definition Unit.h:486
std::string ToString() const
Definition Position.cpp:59

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), CanSparringWith(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_FAKE_DAMAGE, IsAlive(), Object::IsPlayer(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), boss_dred::boss_dredAI::ScheduleTasks(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_kologarn::boss_kologarnAI::UpdateAI(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )

Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.

10608{
10609 if (!m_attacking)
10610 return false;
10611
10612 Unit* victim = m_attacking;
10613
10615 m_attacking = nullptr;
10616
10617 // Clear our target
10619
10621
10623
10624 // reset only at real combat stop
10625 if (Creature* creature = ToCreature())
10626 {
10627 creature->SetNoCallAssistance(false);
10628
10629 if (creature->HasSearchedAssistance())
10630 {
10631 creature->SetNoSearchAssistance(false);
10632 }
10633 }
10634
10635 SendMeleeAttackStop(victim);
10636
10637 return true;
10638}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), advisor_baseAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead_aura::HandleEffectApply(), spell_q11065_wrangle_some_aether_rays_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), boss_janalai::JustEngagedWith(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), boss_janalai::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_felmyst::ScheduleGroundAbilities(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_attumen::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_hadronox::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10741{
10743 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10744 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10745 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10746 auraStates |= (1 << (itr->first - 1));
10747
10748 return auraStates;
10749}
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:294

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
21087{
21088 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
21089 data << GetGUID();
21090 data << uint8(flags);
21091 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
21092 {
21093 data << uint32(itr->first);
21094 data << uint32(itr->second);
21095 }
21096}
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_SPELL_COOLDOWN
Definition Opcodes.h:338

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2077{
2078 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2079 *data << GetPackGUID();
2080 BuildMovementPacket(data);
2081}
PackedGuid const & GetPackGUID() const
Definition Object.h:115
void BuildMovementPacket(ByteBuffer *data) const
Definition Unit.cpp:19875
@ MSG_MOVE_HEARTBEAT
Definition Opcodes.h:268

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
19876{
19877 *data << uint32(GetUnitMovementFlags()); // movement flags
19878 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19879 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19880 *data << GetPositionX();
19881 *data << GetPositionY();
19882 *data << GetPositionZ();
19883 *data << GetOrientation();
19884
19885 // 0x00000200
19887 {
19888 if (m_vehicle)
19889 *data << m_vehicle->GetBase()->GetPackGUID();
19890 else if (GetTransport())
19891 *data << GetTransport()->GetPackGUID();
19892 else
19893 *data << (uint8)0;
19894
19895 *data << float (GetTransOffsetX());
19896 *data << float (GetTransOffsetY());
19897 *data << float (GetTransOffsetZ());
19898 *data << float (GetTransOffsetO());
19899 *data << uint32(GetTransTime());
19900 *data << uint8 (GetTransSeat());
19901
19904 }
19905
19906 // 0x02200000
19909 *data << (float)m_movementInfo.pitch;
19910
19911 *data << (uint32)m_movementInfo.fallTime;
19912
19913 // 0x00001000
19915 {
19916 *data << (float)m_movementInfo.jump.zspeed;
19917 *data << (float)m_movementInfo.jump.sinAngle;
19918 *data << (float)m_movementInfo.jump.cosAngle;
19919 *data << (float)m_movementInfo.jump.xyspeed;
19920 }
19921
19922 // 0x04000000
19924 *data << (float)m_movementInfo.splineElevation;
19925}
std::uint16_t uint16
Definition Define.h:108
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:378
@ MOVEMENTFLAG_FLYING
Definition UnitDefines.h:394
@ MOVEMENTFLAG_FALLING
Definition UnitDefines.h:381
@ MOVEMENTFLAG_SWIMMING
Definition UnitDefines.h:390
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition UnitDefines.h:395
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition UnitDefines.h:432
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition UnitDefines.h:437
uint32 GetUnitMovementFlags() const
Definition Unit.h:765
uint16 GetExtraUnitMovementFlags() const
Definition Unit.h:771
float GetTransOffsetX() const
Definition Object.h:683
float GetTransOffsetY() const
Definition Object.h:684
float GetTransOffsetZ() const
Definition Object.h:685
uint32 GetTransTime() const
Definition Object.h:687
Transport * GetTransport() const
Definition Object.h:682
float GetTransOffsetO() const
Definition Object.h:686
float cosAngle
Definition Object.h:328
float xyspeed
Definition Object.h:328
float zspeed
Definition Object.h:328
float sinAngle
Definition Object.h:328
uint32 time2
Definition Object.h:311
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition Object.h:318
struct MovementInfo::TransportInfo transport
float splineElevation
Definition Object.h:332
float pitch
Definition Object.h:315

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), and SendTeleportPacket().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updateType,
ByteBuffer data,
Player target 
)
overrideprotectedvirtual

Reimplemented from Object.

20800{
20801 if (!target)
20802 return;
20803
20805 uint32 visibleFlag = UF_FLAG_PUBLIC;
20806
20807 if (target == this)
20808 visibleFlag |= UF_FLAG_PRIVATE;
20809
20811 if (GetOwnerGUID() == target->GetGUID())
20812 visibleFlag |= UF_FLAG_OWNER;
20813
20816 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20817
20818 if (plr && plr->IsInSameRaidWith(target))
20819 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20820
20821 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20822
20823 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20824 if (cacheIt != _valuesUpdateCache.end())
20825 {
20826 int32 cachePos = static_cast<int32>(data->wpos());
20827 data->append(cacheIt->second.buffer);
20828
20829 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20830 if (cachePos)
20831 dataAdjustedPos.ApplyOffset(cachePos);
20832
20833 PatchValuesUpdate(*data, dataAdjustedPos, target);
20834
20835 return;
20836 }
20837
20838 BuildValuesCachedBuffer cacheValue(500);
20839
20840 ByteBuffer fieldBuffer(400);
20841
20842 UpdateMask updateMask;
20843 updateMask.SetCount(m_valuesCount);
20844
20845 for (uint16 index = 0; index < m_valuesCount; ++index)
20846 {
20847 if (_fieldNotifyFlags & flags[index] ||
20848 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20849 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20851 {
20852 updateMask.SetBit(index);
20853
20854 if (index == UNIT_NPC_FLAGS)
20855 {
20856 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20857 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20858 }
20859 else if (index == UNIT_FIELD_AURASTATE)
20860 {
20861 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20862 fieldBuffer << uint32(0); // Fill in later.
20863 }
20864 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20865 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20866 {
20867 // convert from float to uint32 and send
20868 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20869 }
20870 // there are some float values which may be negative or can't get negative due to other checks
20871 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20874 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20875 {
20876 fieldBuffer << uint32(m_floatValues[index]);
20877 }
20878 // Gamemasters should be always able to select units - remove not selectable flag
20879 else if (index == UNIT_FIELD_FLAGS)
20880 {
20881 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20882 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20883 }
20884 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20885 else if (index == UNIT_FIELD_DISPLAYID)
20886 {
20887 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20888 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20889 }
20890 else if (index == UNIT_DYNAMIC_FLAGS)
20891 {
20892 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20894 fieldBuffer << dynamicFlags;
20895 }
20896 else if (index == UNIT_FIELD_BYTES_2)
20897 {
20898 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20899 fieldBuffer << m_uint32Values[index];
20900 }
20901 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20902 {
20903 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20904 fieldBuffer << m_uint32Values[index];
20905 }
20906 else
20907 {
20908 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20909 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20910
20911 // send in current format (float as float, uint32 as uint32)
20912 fieldBuffer << m_uint32Values[index];
20913 }
20914 }
20915 }
20916
20917 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20918 updateMask.AppendToPacket(&cacheValue.buffer);
20919 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20920 cacheValue.buffer.append(fieldBuffer);
20921 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20922
20923 int32 cachePos = static_cast<int32>(data->wpos());
20924 data->append(cacheValue.buffer);
20925
20926 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20927 if (cachePos)
20928 dataAdjustedPos.ApplyOffset(cachePos);
20929
20930 PatchValuesUpdate(*data, dataAdjustedPos, target);
20931
20932 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20933}
std::uint64_t uint64
Definition Define.h:106
@ UNIT_DYNFLAG_SPECIALINFO
Definition SharedDefines.h:3375
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition SharedDefines.h:3374
@ UNIT_DYNFLAG_TAPPED
Definition SharedDefines.h:3373
@ SPELL_AURA_EMPATHY
Definition SpellAuraDefines.h:184
@ UPDATETYPE_VALUES
Definition UpdateData.h:28
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition UpdateFieldFlags.cpp:162
@ UF_FLAG_SPECIAL_INFO
Definition UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition UpdateFieldFlags.h:33
@ UNIT_NPC_FLAGS
Definition UpdateFields.h:139
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition UpdateFields.h:157
@ UNIT_FIELD_POSSTAT0
Definition UpdateFields.h:146
@ UNIT_FIELD_RANGEDATTACKTIME
Definition UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition UpdateFields.h:117
@ UNIT_FIELD_NEGSTAT0
Definition UpdateFields.h:151
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition UpdateFields.h:158
@ UNIT_DYNAMIC_FLAGS
Definition UpdateFields.h:136
Definition ByteBuffer.h:70
void append(T value)
Definition ByteBuffer.h:129
std::size_t wpos() const
Definition ByteBuffer.h:330
uint16 _fieldNotifyFlags
Definition Object.h:267
bool HasDynamicFlag(uint32 flag) const
Definition Object.h:123
UpdateMask _changesMask
Definition Object.h:263
uint32 * m_uint32Values
Definition Object.h:259
uint16 m_valuesCount
Definition Object.h:265
float * m_floatValues
Definition Object.h:260
bool IsInSameRaidWith(Player const *p) const
Definition Player.h:1881
ValuesUpdateCache _valuesUpdateCache
Definition Unit.h:2243
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition Unit.cpp:5852
ObjectGuid GetOwnerGUID() const
Definition Unit.h:703
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition Unit.cpp:20935
Definition UpdateMask.h:25
uint32 GetBlockCount() const
Definition UpdateMask.h:62
bool GetBit(uint32 index) const
Definition UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition UpdateMask.h:65
void SetBit(uint32 index)
Definition UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition UpdateMask.h:49
Definition UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition UnitUtils.h:70
Definition UnitUtils.h:110

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2184{
2185 Unit* victim = dmgInfo.GetVictim();
2186 Unit* attacker = dmgInfo.GetAttacker();
2187 uint32 damage = dmgInfo.GetDamage();
2188 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2189 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2190
2191 if (!victim || !victim->IsAlive() || !damage)
2192 return;
2193
2194 // Magic damage, check for resists
2195 // Ignore spells that cant be resisted
2196 // Xinef: holy resistance exists for npcs
2197 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2198 {
2199 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2200
2201 float discreteResistProbability[11];
2202 for (uint32 i = 0; i < 11; ++i)
2203 {
2204 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2205 if (discreteResistProbability[i] < 0.0f)
2206 discreteResistProbability[i] = 0.0f;
2207 }
2208
2209 if (averageResist <= 0.1f)
2210 {
2211 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2212 discreteResistProbability[1] = 5.0f * averageResist;
2213 discreteResistProbability[2] = 2.5f * averageResist;
2214 }
2215
2216 float r = float(rand_norm());
2217 uint32 i = 0;
2218 float probabilitySum = discreteResistProbability[0];
2219
2220 while (r >= probabilitySum && i < 10)
2221 probabilitySum += discreteResistProbability[++i];
2222
2223 float damageResisted = float(damage * i / 10);
2224
2225 if (damageResisted) // if equal to 0, checking these is pointless
2226 {
2227 if (attacker)
2228 {
2230 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2231 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2232 AddPct(damageResisted, -(*j)->GetAmount());
2233
2235 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2236 if ((*j)->GetMiscValue() & schoolMask)
2237 AddPct(damageResisted, -(*j)->GetAmount());
2238 }
2239
2240 // pussywizard:
2241 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2242 {
2243 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2244 uint32 armorReduction = damage - damageAfterArmor;
2245 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2246 damageResisted = armorReduction;
2247 }
2248 }
2249
2250 dmgInfo.ResistDamage(uint32(damageResisted));
2251 }
2252
2253 // Ignore Absorption Auras
2254 float auraAbsorbMod = 0;
2255 if (attacker)
2256 {
2258 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2259 {
2260 if (!((*itr)->GetMiscValue() & schoolMask))
2261 continue;
2262
2263 if ((*itr)->GetAmount() > auraAbsorbMod)
2264 auraAbsorbMod = float((*itr)->GetAmount());
2265 }
2266
2268 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2269 {
2270 if (!((*itr)->GetMiscValue() & schoolMask))
2271 continue;
2272
2273 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2274 auraAbsorbMod = float((*itr)->GetAmount());
2275 }
2276 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2277 }
2278
2279 // We're going to call functions which can modify content of the list during iteration over it's elements
2280 // Let's copy the list so we can prevent iterator invalidation
2282 std::sort(vSchoolAbsorbCopy.begin(), vSchoolAbsorbCopy.end(), Acore::AbsorbAuraOrderPred());
2283
2284 // absorb without mana cost
2285 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2286 {
2287 AuraEffect* absorbAurEff = *itr;
2288 // Check if aura was removed during iteration - we don't need to work on such auras
2289 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2290 if (!aurApp)
2291 continue;
2292 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2293 continue;
2294
2295 // get amount which can be still absorbed by the aura
2296 int32 currentAbsorb = absorbAurEff->GetAmount();
2297 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2298 if (currentAbsorb < 0)
2299 currentAbsorb = 0;
2300
2301 uint32 tempAbsorb = uint32(currentAbsorb);
2302
2303 bool defaultPrevented = false;
2304
2305 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2306 currentAbsorb = tempAbsorb;
2307
2308 if (defaultPrevented)
2309 continue;
2310
2311 // absorb must be smaller than the damage itself
2312 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2313
2314 // xinef: do this after absorb is rounded to damage...
2315 AddPct(currentAbsorb, -auraAbsorbMod);
2316
2317 dmgInfo.AbsorbDamage(currentAbsorb);
2318
2319 tempAbsorb = currentAbsorb;
2320 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2321
2322 // Check if our aura is using amount to count damage
2323 if (absorbAurEff->GetAmount() >= 0)
2324 {
2325 // Reduce shield amount
2326 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2327 // Aura cannot absorb anything more - remove it
2328 if (absorbAurEff->GetAmount() <= 0)
2329 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2330 }
2331 }
2332
2333 // absorb by mana cost
2335 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2336 {
2337 AuraEffect* absorbAurEff = *itr;
2338 // Check if aura was removed during iteration - we don't need to work on such auras
2339 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2340 if (!aurApp)
2341 continue;
2342 // check damage school mask
2343 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2344 continue;
2345
2346 // get amount which can be still absorbed by the aura
2347 int32 currentAbsorb = absorbAurEff->GetAmount();
2348 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2349 if (currentAbsorb < 0)
2350 currentAbsorb = 0;
2351
2352 uint32 tempAbsorb = currentAbsorb;
2353
2354 bool defaultPrevented = false;
2355
2356 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2357 currentAbsorb = tempAbsorb;
2358
2359 if (defaultPrevented)
2360 continue;
2361
2362 // absorb must be smaller than the damage itself
2363 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2364
2365 // xinef: do this after absorb is rounded to damage...
2366 AddPct(currentAbsorb, -auraAbsorbMod);
2367
2368 int32 manaReduction = currentAbsorb;
2369
2370 // lower absorb amount by talents
2371 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2372 manaReduction = int32(float(manaReduction) * manaMultiplier);
2373
2374 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2375
2376 // take case when mana has ended up into account
2377 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2378
2379 dmgInfo.AbsorbDamage(currentAbsorb);
2380
2381 tempAbsorb = currentAbsorb;
2382 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2383
2384 // Check if our aura is using amount to count damage
2385 if (absorbAurEff->GetAmount() >= 0)
2386 {
2387 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2388 if ((absorbAurEff->GetAmount() <= 0))
2389 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2390 }
2391 }
2392
2393 // split damage auras - only when not damaging self
2394 // Xinef: not true - Warlock Hellfire
2395 if (/*victim != attacker &&*/ !Splited)
2396 {
2397 // We're going to call functions which can modify content of the list during iteration over it's elements
2398 // Let's copy the list so we can prevent iterator invalidation
2399 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2400 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2401 {
2402 // Check if aura was removed during iteration - we don't need to work on such auras
2403 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2404 continue;
2405 // check damage school mask
2406 if (!((*itr)->GetMiscValue() & schoolMask))
2407 continue;
2408
2409 // Damage can be splitted only if aura has an alive caster
2410 Unit* caster = (*itr)->GetCaster();
2411 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2412 continue;
2413
2414 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2415 // Ignore LOS attribute is only used for the cast portion of the spell
2416 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2417 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2418 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2419 continue;
2420
2421 int32 splitDamage = (*itr)->GetAmount();
2422
2423 // absorb must be smaller than the damage itself
2424 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2425
2426 dmgInfo.AbsorbDamage(splitDamage);
2427
2428 uint32 splitted = splitDamage;
2429 uint32 splitted_absorb = 0;
2430 uint32 splitted_resist = 0;
2431
2432 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2433 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2434 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2435 {
2436 procEx |= PROC_EX_IMMUNE;
2437 splittedDmgInfo.AbsorbDamage(splitted);
2438 }
2439 else
2440 {
2441 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2442 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2443 }
2444
2445 splitted_absorb = splittedDmgInfo.GetAbsorb();
2446 splitted_resist = splittedDmgInfo.GetResist();
2447 splitted = splittedDmgInfo.GetDamage();
2448
2449 // create procs
2450 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2451 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2452
2453 if (attacker)
2454 {
2455 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2456 }
2457
2458 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2459 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2460 }
2461
2462 // We're going to call functions which can modify content of the list during iteration over it's elements
2463 // Let's copy the list so we can prevent iterator invalidation
2465 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(); (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2466 {
2467 // Check if aura was removed during iteration - we don't need to work on such auras
2468 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2469 if (!aurApp)
2470 continue;
2471
2472 // check damage school mask
2473 if (!((*itr)->GetMiscValue() & schoolMask))
2474 continue;
2475
2476 // Damage can be splitted only if aura has an alive caster
2477 Unit* caster = (*itr)->GetCaster();
2478 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2479 continue;
2480
2481 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2482 // Ignore LOS attribute is only used for the cast portion of the spell
2483 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2484 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2485 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2486 continue;
2487
2488 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2489 SpellSchoolMask splitSchoolMask = schoolMask;
2490
2491 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2492
2493 // absorb must be smaller than the damage itself
2494 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2495
2496 // Roar of Sacrifice, dont absorb it
2497 if (splitSpellInfo->Id != 53480)
2498 dmgInfo.AbsorbDamage(splitDamage);
2499 else
2500 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2501
2502 uint32 splitted = splitDamage;
2503 uint32 splitted_absorb = 0;
2504 uint32 splitted_resist = 0;
2505
2506 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2507 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2508 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2509 {
2510 procEx |= PROC_EX_IMMUNE;
2511 splittedDmgInfo.AbsorbDamage(splitted);
2512 }
2513 else
2514 {
2515 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2516 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2517 }
2518
2519 splitted_absorb = splittedDmgInfo.GetAbsorb();
2520 splitted_resist = splittedDmgInfo.GetResist();
2521 splitted = splittedDmgInfo.GetDamage();
2522
2523 // create procs
2524 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2525 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2526
2527 if (attacker)
2528 {
2529 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2530 }
2531
2532 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2533 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2534 }
2535 }
2536}
double rand_norm()
Definition Random.cpp:85
@ POWER_MANA
Definition SharedDefines.h:280
@ SPELL_ATTR4_NO_CAST_LOG
Definition SharedDefines.h:541
SpellSchoolMask
Definition SharedDefines.h:306
@ SPELL_SCHOOL_MASK_NORMAL
Definition SharedDefines.h:308
@ SPELL_SCHOOL_MASK_NATURE
Definition SharedDefines.h:311
@ SPELL_SCHOOL_MASK_HOLY
Definition SharedDefines.h:309
@ SPELL_AURA_MANA_SHIELD
Definition SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition SpellAuraDefines.h:394
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition SpellInfo.h:199
@ PROC_EX_NORMAL_HIT
Definition SpellMgr.h:193
@ PROC_EX_IMMUNE
Definition SpellMgr.h:201
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition Unit.cpp:16141
@ DIRECT_DAMAGE
Definition Unit.h:255
@ MELEE_HIT_NORMAL
Definition Unit.h:293
T RoundToInterval(T &num, T floor, T ceil)
Definition Util.h:70
Definition SpellAuraEffects.h:347
Definition SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition SpellAuraEffects.h:54
void SetAmount(int32 amount)
Definition SpellAuraEffects.h:66
Unit * GetCaster() const
Definition SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition SpellAuraEffects.cpp:442
Aura * GetBase() const
Definition SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition SpellAuraEffects.h:56
int32 GetAmount() const
Definition SpellAuraEffects.h:64
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2483
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2501
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2515
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2529
void ResistDamage(uint32 amount)
Definition Unit.cpp:161
void AbsorbDamage(uint32 amount)
Definition Unit.cpp:154
Unit * GetVictim() const
Definition Unit.h:366
Unit * GetAttacker() const
Definition Unit.h:365
SpellInfo const * GetSpellInfo() const
Definition Unit.h:367
DamageEffectType GetDamageType() const
Definition Unit.h:369
SpellSchoolMask GetSchoolMask() const
Definition Unit.h:368
uint32 GetDamage() const
Definition Unit.h:371
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition SpellInfo.cpp:2217
bool IsPositive() const
Definition SpellInfo.cpp:1237
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:14322
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1413
std::vector< AuraEffect * > AuraEffectList
Definition Unit.h:671
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition Unit.cpp:2067
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition Unit.cpp:2149
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition Unit.cpp:6537
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:16275
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:13067
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition Unit.cpp:2183
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition Unit.cpp:824
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1342
Definition Unit.h:322

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), Object::IsCreature(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), DealDamage(), DealDamageShieldDamage(), Player::EnvironmentalDamage(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2068{
2069 float armor = float(victim->GetArmor());
2070
2071 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2072 if (attacker)
2073 {
2074 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2075
2076 if (spellInfo)
2077 if (Player* modOwner = attacker->GetSpellModOwner())
2078 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2079
2080 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2081 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2082 {
2083 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2084 && (*j)->IsAffectedOnSpell(spellInfo))
2085 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2086 }
2087
2088 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2089 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2090 {
2091 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2092 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2093 }
2094
2095 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2096 if (attacker->IsPlayer())
2097 {
2098 float bonusPct = 0;
2099 bonusPct += attacker->GetTotalAuraModifier(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, [spellInfo,attacker](AuraEffect const* aurEff)
2100 {
2101 if (aurEff->GetSpellInfo()->EquippedItemClass == -1)
2102 {
2103 if (!spellInfo || aurEff->IsAffectedOnSpell(spellInfo) || aurEff->GetMiscValue() & spellInfo->GetSchoolMask())
2104 return true;
2105 else if (!aurEff->GetMiscValue() && !aurEff->HasSpellClassMask())
2106 return true;
2107 }
2108 else
2109 {
2110 if (attacker->ToPlayer()->HasItemFitToSpellRequirements(aurEff->GetSpellInfo()))
2111 return true;
2112 }
2113 return false;
2114 });
2115
2116 float maxArmorPen = 0;
2117 if (victim->GetLevel() < 60)
2118 maxArmorPen = float(400 + 85 * victim->GetLevel());
2119 else
2120 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2121
2122 // Cap armor penetration to this number
2123 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2124 // Figure out how much armor do we ignore
2125 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2126 // Got the value, apply it
2127 armor -= std::min(armorPen, maxArmorPen);
2128 }
2129 }
2130
2131 if (armor < 0.0f)
2132 armor = 0.0f;
2133
2134 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2135 if (levelModifier > 59)
2136 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2137
2138 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2139 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2140
2141 if (tmpvalue < 0.0f)
2142 tmpvalue = 0.0f;
2143 if (tmpvalue > 0.75f)
2144 tmpvalue = 0.75f;
2145
2146 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2147}
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition SpellAuraDefines.h:186
@ SPELLMOD_IGNORE_ARMOR
Definition SpellDefines.h:89
@ CR_ARMOR_PENETRATION
Definition Unit.h:248
bool IsAffectedOnSpell(SpellInfo const *spell) const
Definition SpellAuraEffects.cpp:1092
bool HasSpellClassMask() const
Definition SpellAuraEffects.cpp:1106
int32 EquippedItemClass
Definition SpellInfo.h:375

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, SpellInfo::EquippedItemClass, GetArmor(), GetAuraEffectsByType(), GetLevel(), AuraEffect::GetMiscValue(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), AuraEffect::HasSpellClassMask(), SpellInfo::Id, AuraEffect::IsAffectedOnSpell(), Object::IsPlayer(), SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, and Object::ToPlayer().

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2539{
2540 if (!healInfo.GetHeal())
2541 return;
2542
2543 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2544 int32 absorbAmount = 0;
2545
2546 // Need remove expired auras after
2547 bool existExpired = false;
2548
2549 // absorb without mana cost
2551 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2552 {
2553 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2554 continue;
2555
2556 // Max Amount can be absorbed by this aura
2557 int32 currentAbsorb = (*i)->GetAmount();
2558
2559 // Found empty aura (impossible but..)
2560 if (currentAbsorb <= 0)
2561 {
2562 existExpired = true;
2563 continue;
2564 }
2565
2566 // currentAbsorb - damage can be absorbed by shield
2567 // If need absorb less damage
2568 if (healing < currentAbsorb + absorbAmount)
2569 currentAbsorb = healing - absorbAmount;
2570
2571 absorbAmount += currentAbsorb;
2572
2573 // Reduce shield amount
2574 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2575 // Need remove it later
2576 if ((*i)->GetAmount() <= 0)
2577 existExpired = true;
2578 }
2579
2580 // Remove all expired absorb auras
2581 if (existExpired)
2582 {
2583 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2584 {
2585 AuraEffect* auraEff = *i;
2586 ++i;
2587 if (auraEff->GetAmount() <= 0)
2588 {
2589 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2591 if (healInfo.GetTarget()->m_removedAurasCount > removedAuras)
2592 i = vHealAbsorb.begin();
2593 }
2594 }
2595 }
2596
2597 if (absorbAmount > 0)
2598 healInfo.AbsorbHeal(absorbAmount);
2599}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition Unit.h:422
void AbsorbHeal(uint32 amount)
Definition Unit.h:397
Unit * GetTarget() const
Definition Unit.h:418
uint32 GetHeal() const
Definition Unit.h:419
uint32 SchoolMask
Definition SpellInfo.h:392

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14962{
14963 uint8 comboPoints = GetComboPoints();
14964
14965 int32 minduration = spellProto->GetDuration();
14966 int32 maxduration = spellProto->GetMaxDuration();
14967
14968 int32 duration;
14969
14970 if (comboPoints && minduration != -1 && minduration != maxduration)
14971 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14972 else
14973 duration = minduration;
14974
14975 return duration;
14976}
uint8 GetComboPoints(Unit const *who=nullptr) const
Definition Unit.h:999

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
bool  npcCaster 
) const
20370{
20371 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20372 if (npcCaster)
20374
20375 return damage;
20376}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:292
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6156

References GetTotalAuraMultiplierByMiscMask(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, and SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
3023{
3024 float minDamage = 0.0f;
3025 float maxDamage = 0.0f;
3026
3027 if (normalized || !addTotalPct || itemDamagesMask)
3028 {
3029 // get both by default
3030 if (!itemDamagesMask)
3031 {
3032 itemDamagesMask = (1 << 0) | (1 << 1);
3033 }
3034
3035 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
3036 {
3037 if (itemDamagesMask & (1 << i))
3038 {
3039 float minTmp, maxTmp;
3040 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
3041 minDamage += minTmp;
3042 maxDamage += maxTmp;
3043 }
3044 }
3045 }
3046 else
3047 {
3048 switch (attType)
3049 {
3050 case RANGED_ATTACK:
3053 break;
3054 case BASE_ATTACK:
3057 break;
3058 case OFF_ATTACK:
3061 break;
3062 default:
3063 break;
3064 }
3065 }
3066
3067 minDamage = std::max(0.f, minDamage);
3068 maxDamage = std::max(0.f, maxDamage);
3069
3070 if (minDamage > maxDamage)
3071 {
3072 std::swap(minDamage, maxDamage);
3073 }
3074
3075 return urand(uint32(minDamage), uint32(maxDamage));
3076}
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
@ UNIT_FIELD_MINDAMAGE
Definition UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition UpdateFields.h:129
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17441{
17442 // Damage over Time spells bonus calculation
17443 float DotFactor = 1.0f;
17444 if (damagetype == DOT)
17445 {
17446 int32 DotDuration = spellInfo->GetDuration();
17447 if (!spellInfo->IsChanneled() && DotDuration > 0)
17448 DotFactor = DotDuration / 15000.0f;
17449
17450 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17451 DotFactor /= DotTicks;
17452 }
17453
17454 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17455 // Distribute Damage over multiple effects, reduce by AoE
17456 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17457
17458 // As wowwiki says: C = (Cast Time / 3.5)
17459 return (CastingTime / 3500.0f) * DotFactor;
17460}
@ DOT
Definition Unit.h:257
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition Unit.cpp:17322

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken(), and SpellHealingBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3079{
3080 if (!IsPlayer())
3081 return 1.0f;
3082
3083 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3084 return 1.0f;
3085
3086 float LvlPenalty = 0.0f;
3087
3088 // xinef: added brackets
3089 if (spellProto->SpellLevel < 20)
3090 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3091
3092 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3093 if (LvlFactor > 1.0f)
3094 LvlFactor = 1.0f;
3095
3096 return AddPct(LvlFactor, -LvlPenalty);
3097}
uint8 GetLevel() const
Definition Unit.h:1088

References AddPct(), GetLevel(), Object::IsPlayer(), SpellInfo::MaxLevel, and SpellInfo::SpellLevel.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), and SpellHealingBonusTaken().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1497{
1498 damageInfo->attacker = this;
1499 damageInfo->target = victim;
1500
1501 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1502 {
1503 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1504 damageInfo->damages[i].damage = 0;
1505 damageInfo->damages[i].absorb = 0;
1506 damageInfo->damages[i].resist = 0;
1507 }
1508
1509 damageInfo->attackType = attackType;
1510 damageInfo->cleanDamage = 0;
1511 damageInfo->blocked_amount = 0;
1512
1513 damageInfo->TargetState = 0;
1514 damageInfo->HitInfo = 0;
1515 damageInfo->procAttacker = PROC_FLAG_NONE;
1516 damageInfo->procVictim = PROC_FLAG_NONE;
1517 damageInfo->procEx = PROC_EX_NONE;
1518 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1519
1520 if (!victim)
1521 return;
1522
1523 if (!IsAlive() || !victim->IsAlive())
1524 return;
1525
1526 // Select HitInfo/procAttacker/procVictim flag based on attack type
1527 switch (attackType)
1528 {
1529 case BASE_ATTACK:
1532 break;
1533 case OFF_ATTACK:
1536 damageInfo->HitInfo = HITINFO_OFFHAND;
1537 break;
1538 default:
1539 return;
1540 }
1541
1542 // School Immune check
1543 uint8 immunedMask = 0;
1544 bool hasNonPhysicalSchoolMask = false;
1545 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1546 {
1548 {
1549 immunedMask |= (1 << i);
1551 {
1552 hasNonPhysicalSchoolMask = true;
1553 }
1554 }
1555 }
1556
1557 // School Immune check
1558 if (immunedMask & ((1 << 0) | (1 << 1)))
1559 {
1560 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1561 {
1562 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1563 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1564
1565 damageInfo->procEx |= PROC_EX_IMMUNE;
1566 return;
1567 }
1568 }
1569
1570 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1571 {
1572 // only players have secondary weapon damage
1573 if (i > 0 && !IsPlayer())
1574 {
1575 break;
1576 }
1577
1578 if (immunedMask & (1 << i))
1579 {
1580 continue;
1581 }
1582
1583 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1584 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1585
1586 uint32 damage = 0;
1587 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1588
1589 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1590 // Add melee damage bonus
1591 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1592 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1593
1594 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1595 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1596
1597 if (victim->GetAI())
1598 {
1599 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1600 }
1601
1602 // Calculate armor reduction
1604 {
1605 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1606 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1607 }
1608 else
1609 {
1610 damageInfo->damages[i].damage = damage;
1611 }
1612 }
1613
1614 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1615
1616 // If the victim was a sitting player and we didn't roll a miss, then crit.
1617 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1618 {
1619 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1620 }
1621 switch (damageInfo->hitOutCome)
1622 {
1623 case MELEE_HIT_EVADE:
1625 damageInfo->TargetState = VICTIMSTATE_EVADES;
1626 damageInfo->procEx |= PROC_EX_EVADE;
1627
1628 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1629 {
1630 damageInfo->damages[i].damage = 0;
1631 }
1632
1633 damageInfo->cleanDamage = 0;
1634 return;
1635 case MELEE_HIT_MISS:
1636 damageInfo->HitInfo |= HITINFO_MISS;
1637 damageInfo->TargetState = VICTIMSTATE_INTACT;
1638 damageInfo->procEx |= PROC_EX_MISS;
1639
1640 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1641 {
1642 damageInfo->damages[i].damage = 0;
1643 }
1644 damageInfo->cleanDamage = 0;
1645 break;
1646 case MELEE_HIT_NORMAL:
1647 damageInfo->TargetState = VICTIMSTATE_HIT;
1648 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1649 break;
1650 case MELEE_HIT_CRIT:
1651 {
1652 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1653 damageInfo->TargetState = VICTIMSTATE_HIT;
1654
1655 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1656 // Crit bonus calc
1657 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1658 {
1659 damageInfo->damages[i].damage *= 2;
1660
1661 float mod = 0.0f;
1662 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1663 if (damageInfo->attackType == RANGED_ATTACK)
1664 {
1666 }
1667 else
1668 {
1670
1671 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1673 }
1674
1675 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1676
1677 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1679 if (mod != 0)
1680 {
1681 AddPct(damageInfo->damages[i].damage, mod);
1682 }
1683 }
1684 break;
1685 }
1686 case MELEE_HIT_PARRY:
1687 damageInfo->TargetState = VICTIMSTATE_PARRY;
1688 damageInfo->procEx |= PROC_EX_PARRY;
1689 damageInfo->cleanDamage = 0;
1690
1691 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1692 {
1693 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1694 damageInfo->damages[i].damage = 0;
1695 }
1696 break;
1697 case MELEE_HIT_DODGE:
1698 damageInfo->TargetState = VICTIMSTATE_DODGE;
1699 damageInfo->procEx |= PROC_EX_DODGE;
1700 damageInfo->cleanDamage = 0;
1701
1702 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1703 {
1704 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1705 damageInfo->damages[i].damage = 0;
1706 }
1707 break;
1708 case MELEE_HIT_BLOCK:
1709 {
1710 damageInfo->TargetState = VICTIMSTATE_HIT;
1711 damageInfo->HitInfo |= HITINFO_BLOCK;
1712 damageInfo->procEx |= PROC_EX_BLOCK;
1713 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1714 // double blocked amount if block is critical
1715 if (damageInfo->target->isBlockCritical())
1716 damageInfo->blocked_amount += damageInfo->blocked_amount;
1717
1718 uint32 remainingBlock = damageInfo->blocked_amount;
1719 uint8 fullBlockMask = 0;
1720 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1721 {
1722 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1723 {
1724 fullBlockMask |= (1 << i);
1725
1726 remainingBlock -= damageInfo->damages[i].damage;
1727 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1728 damageInfo->damages[i].damage = 0;
1729 }
1730 else
1731 {
1732 damageInfo->cleanDamage += remainingBlock;
1733 damageInfo->damages[i].damage -= remainingBlock;
1734 remainingBlock = 0;
1735 }
1736 }
1737
1738 // full block
1739 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1740 {
1741 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1742 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1743 damageInfo->blocked_amount -= remainingBlock;
1744 }
1745 break;
1746 }
1747 case MELEE_HIT_GLANCING:
1748 {
1749 damageInfo->HitInfo |= HITINFO_GLANCING;
1750 damageInfo->TargetState = VICTIMSTATE_HIT;
1751 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1752 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1753 if (leveldif > 3)
1754 leveldif = 3;
1755 float reducePercent = 1 - leveldif * 0.1f;
1756
1757 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1758 {
1759 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1760 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1761 damageInfo->damages[i].damage = reducedDamage;
1762 }
1763 break;
1764 }
1765 case MELEE_HIT_CRUSHING:
1766 damageInfo->HitInfo |= HITINFO_CRUSHING;
1767 damageInfo->TargetState = VICTIMSTATE_HIT;
1768 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1769
1770 // 150% normal damage
1771 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1772 {
1773 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1774 }
1775 break;
1776 default:
1777 break;
1778 }
1779
1780 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1781 if (!(damageInfo->HitInfo & HITINFO_MISS))
1782 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1783
1784 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1785
1786 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1787 {
1788 int32 dmg = damageInfo->damages[i].damage;
1789 int32 cleanDamage = damageInfo->cleanDamage;
1790 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1791 if (CanApplyResilience())
1792 {
1793 int32 resilienceReduction = damageInfo->damages[i].damage;
1794 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1795
1796 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1797 dmg -= resilienceReduction;
1798 cleanDamage += resilienceReduction;
1799 }
1800
1801 damageInfo->damages[i].damage = std::max(0, dmg);
1802 damageInfo->cleanDamage = std::max(0, cleanDamage);
1803
1804 // Calculate absorb resist
1805 if (damageInfo->damages[i].damage > 0)
1806 {
1807 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1808
1809 // Calculate absorb & resists
1810 DamageInfo dmgInfo(*damageInfo, i);
1811 Unit::CalcAbsorbResist(dmgInfo);
1812 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1813 damageInfo->damages[i].resist = dmgInfo.GetResist();
1814
1815 if (damageInfo->damages[i].absorb)
1816 {
1817 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1818 }
1819
1820 if (damageInfo->damages[i].resist)
1821 {
1822 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1823 }
1824
1825 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1826 }
1827 }
1828
1829 // set proper HitInfo flags
1830 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1831 {
1832 // set partial absorb when secondary damage isn't full absorbed
1833 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1834 }
1835 else
1836 {
1837 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1838 }
1839
1840 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1841 {
1842 // set partial resist when secondary damage isn't full resisted
1843 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1844 }
1845 else
1846 {
1847 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1848 }
1849
1851 {
1852 damageInfo->procEx |= PROC_EX_ABSORB;
1853 }
1854
1855 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1856 {
1857 damageInfo->procEx |= PROC_EX_RESIST;
1858 }
1859}
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition SpellAuraDefines.h:266
@ PROC_EX_NONE
Definition SpellMgr.h:192
@ PROC_EX_DODGE
Definition SpellMgr.h:197
@ PROC_EX_BLOCK
Definition SpellMgr.h:199
@ PROC_EX_CRITICAL_HIT
Definition SpellMgr.h:194
@ PROC_EX_MISS
Definition SpellMgr.h:195
@ PROC_EX_RESIST
Definition SpellMgr.h:196
@ PROC_EX_FULL_BLOCK
Definition SpellMgr.h:206
@ PROC_EX_ABSORB
Definition SpellMgr.h:203
@ PROC_EX_PARRY
Definition SpellMgr.h:198
@ PROC_EX_EVADE
Definition SpellMgr.h:200
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition SpellMgr.h:109
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition SpellMgr.h:139
@ PROC_FLAG_TAKEN_DAMAGE
Definition SpellMgr.h:136
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition SpellMgr.h:110
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition SpellMgr.h:140
@ PROC_FLAG_NONE
Definition SpellMgr.h:104
@ VICTIMSTATE_INTACT
Definition Unit.h:85
@ VICTIMSTATE_HIT
Definition Unit.h:86
@ VICTIMSTATE_DODGE
Definition Unit.h:87
@ VICTIMSTATE_IS_IMMUNE
Definition Unit.h:92
@ VICTIMSTATE_PARRY
Definition Unit.h:88
@ VICTIMSTATE_BLOCKS
Definition Unit.h:90
@ VICTIMSTATE_EVADES
Definition Unit.h:91
@ HITINFO_PARTIAL_ABSORB
Definition Unit.h:105
@ HITINFO_FULL_RESIST
Definition Unit.h:106
@ HITINFO_NORMALSWING
Definition Unit.h:98
@ HITINFO_BLOCK
Definition Unit.h:112
@ HITINFO_CRUSHING
Definition Unit.h:116
@ HITINFO_SWINGNOHITSOUND
Definition Unit.h:120
@ HITINFO_MISS
Definition Unit.h:103
@ HITINFO_FULL_ABSORB
Definition Unit.h:104
@ HITINFO_OFFHAND
Definition Unit.h:101
@ HITINFO_GLANCING
Definition Unit.h:115
@ HITINFO_CRITICALHIT
Definition Unit.h:108
@ HITINFO_PARTIAL_RESIST
Definition Unit.h:107
@ HITINFO_AFFECTS_VICTIM
Definition Unit.h:100
@ MELEE_HIT_CRUSHING
Definition Unit.h:293
@ MELEE_HIT_BLOCK
Definition Unit.h:292
@ MELEE_HIT_CRIT
Definition Unit.h:293
@ MELEE_HIT_EVADE
Definition Unit.h:292
@ MELEE_HIT_DODGE
Definition Unit.h:292
@ MELEE_HIT_MISS
Definition Unit.h:292
@ MELEE_HIT_PARRY
Definition Unit.h:292
@ MELEE_HIT_GLANCING
Definition Unit.h:293
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Called during damage calculations.
Definition UnitAI.h:380
bool isBlockCritical()
Definition Unit.cpp:3164
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13430
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6146
bool CanApplyResilience() const
Definition Unit.h:1156
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition Unit.cpp:3022
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition Unit.cpp:19174
UnitAI * GetAI()
Definition Unit.h:683
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition Unit.cpp:2044
int32 GetTotalAuraModifier(AuraType auratype) const
Definition Unit.cpp:6126
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition Unit.cpp:2821
uint32 GetCreatureTypeMask() const
Definition Unit.h:818
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13240
uint32 damageSchoolMask
Definition Unit.h:476
uint32 blocked_amount
Definition Unit.h:482
MeleeHitOutcome hitOutCome
Definition Unit.h:491
uint32 cleanDamage
Definition Unit.h:490
uint32 TargetState
Definition Unit.h:484
uint32 resist
Definition Unit.h:479

References CalcDamageInfo::absorb, AddPct(), ApplyResilience(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculateDamage(), CanApplyResilience(), CalcDamageInfo::cleanDamage, CR_CRIT_TAKEN_MELEE, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), GetLevel(), GetMeleeDamageSchoolMask(), DamageInfo::GetResist(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_DAMAGE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1328{
1329 if (damage < 0)
1330 return;
1331
1332 Unit* victim = damageInfo->target;
1333 if (!victim || !victim->IsAlive())
1334 return;
1335
1336 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1337 uint32 crTypeMask = victim->GetCreatureTypeMask();
1338
1339 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1340 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1341
1342 if (victim->GetAI())
1343 {
1344 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1345 }
1346
1347 int32 cleanDamage = 0;
1348 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1349 {
1350 int32 oldDamage = damage;
1351 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1352 cleanDamage = oldDamage - damage;
1353 }
1354
1355 bool blocked = false;
1356 // Per-school calc
1357 switch (spellInfo->DmgClass)
1358 {
1359 // Melee and Ranged Spells
1362 {
1363 // Physical Damage
1364 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1365 {
1366 // Get blocked status
1367 blocked = isSpellBlocked(victim, spellInfo, attackType);
1368 }
1369
1370 if (crit)
1371 {
1372 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1373
1374 // Calculate crit bonus
1375 uint32 crit_bonus = damage;
1376 // Apply crit_damage bonus for melee spells
1377 if (Player* modOwner = GetSpellModOwner())
1378 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1379 damage += crit_bonus;
1380
1381 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1382 float critPctDamageMod = 0.0f;
1383 if (attackType == RANGED_ATTACK)
1385 else
1387
1388 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1389 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1390
1391 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1393
1394 if (critPctDamageMod != 0)
1395 AddPct(damage, critPctDamageMod);
1396 }
1397
1398 // Spell weapon based damage CAN BE crit & blocked at same time
1399 if (blocked)
1400 {
1401 damageInfo->blocked = victim->GetShieldBlockValue();
1402 // double blocked amount if block is critical
1403 if (victim->isBlockCritical())
1404 damageInfo->blocked *= 2;
1405 if (damage < int32(damageInfo->blocked))
1406 damageInfo->blocked = uint32(damage);
1407
1408 damage -= damageInfo->blocked;
1409 cleanDamage += damageInfo->blocked;
1410 }
1411
1412 int32 resilienceReduction = damage;
1413 if (CanApplyResilience())
1414 {
1415 if (attackType != RANGED_ATTACK)
1416 {
1417 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1418 }
1419 else
1420 {
1421 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1422 }
1423 }
1424
1425 resilienceReduction = damage - resilienceReduction;
1426 damage -= resilienceReduction;
1427 cleanDamage += resilienceReduction;
1428 break;
1429 }
1430 // Magical Attacks
1433 {
1434 // If crit add critical bonus
1435 if (crit)
1436 {
1437 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1438 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1439 }
1440
1441 int32 resilienceReduction = damage;
1442 if (CanApplyResilience())
1443 {
1444 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1445 }
1446
1447 resilienceReduction = damage - resilienceReduction;
1448 damage -= resilienceReduction;
1449 cleanDamage += resilienceReduction;
1450 break;
1451 }
1452 default:
1453 break;
1454 }
1455
1456 damageInfo->cleanDamage = std::max(0, cleanDamage);
1457 damageInfo->damage = std::max(0, damage);
1458
1459 // Calculate absorb resist
1460 if (damageInfo->damage > 0)
1461 {
1462 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1463 Unit::CalcAbsorbResist(dmgInfo);
1464 damageInfo->absorb = dmgInfo.GetAbsorb();
1465 damageInfo->resist = dmgInfo.GetResist();
1466 damageInfo->damage = dmgInfo.GetDamage();
1467 }
1468}
@ SPELL_DAMAGE_CLASS_RANGED
Definition SharedDefines.h:1559
@ SPELL_DAMAGE_CLASS_MAGIC
Definition SharedDefines.h:1557
@ SPELL_DAMAGE_CLASS_NONE
Definition SharedDefines.h:1556
@ SPELL_DAMAGE_CLASS_MELEE
Definition SharedDefines.h:1558
@ SPELL_HIT_TYPE_CRIT
Definition SharedDefines.h:1547
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition SpellDefines.h:91
@ SPELL_DIRECT_DAMAGE
Definition Unit.h:256
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition UnitAI.h:381
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition Unit.cpp:3138
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition Unit.cpp:12464
Unit * target
Definition Unit.h:502
uint32 HitInfo
Definition Unit.h:513
uint32 damage
Definition Unit.h:505
uint32 absorb
Definition Unit.h:508
Unit * attacker
Definition Unit.h:503
uint32 schoolMask
Definition Unit.h:507
uint32 cleanDamage
Definition Unit.h:515
uint32 resist
Definition Unit.h:509
uint32 blocked
Definition Unit.h:512

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

bool Unit::CanApplyResilience ( ) const
inline

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
1704 {
1707 }
@ UNIT_STATE_DISTRACTED
Definition UnitDefines.h:182
@ UNIT_STATE_CONFUSED
Definition UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition UnitDefines.h:177
@ UNIT_STATE_IN_FLIGHT
Definition UnitDefines.h:178
@ UNIT_STATE_STUNNED
Definition UnitDefines.h:173

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( bool  skipAliveCheck = false) const
14720{
14721 // only creatures can have threat list
14722 if (!IsCreature())
14723 return false;
14724
14725 // only alive units can have threat list
14726 if (!skipAliveCheck && !IsAlive())
14727 return false;
14728
14729 // totems can not have threat list
14730 if (ToCreature()->IsTotem())
14731 return false;
14732
14733 // vehicles can not have threat list
14734 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14735 return false;
14736
14737 // summons can not have a threat list, unless they are controlled by a creature
14739 return false;
14740
14741 return true;
14742}
@ UNIT_MASK_CONTROLLABLE_GUARDIAN
Definition UnitDefines.h:164
@ UNIT_MASK_GUARDIAN
Definition UnitDefines.h:158
bool IsVehicle() const
Definition Unit.h:790
Map * GetMap() const
Definition Object.h:620

References WorldObject::GetMap(), GetOwnerGUID(), HasUnitTypeMask(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
1572{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
1542{ return !m_procDeep; }

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21325{
21326 // Aura of Despair exceptions
21327 switch (spellInfo->Id)
21328 {
21329 case 16666: // Demonic Rune
21330 case 27869: // Dark Rune
21331 case 30824: // Shamanistic Rage
21332 case 31786: // Spiritual Attunement
21333 case 31930: // Judgements of the Wise
21334 case 34075: // Aspect of the Viper
21335 case 34720: // Thrill of the hunt
21336 case 47755: // Rapture
21337 case 54425: // Improved Felhunter
21338 case 57319: // Blessing of Sanctuary
21339 case 63337: // Saronite Vapors (regenerate mana)
21340 case 63375: // Improved stormstrike
21341 case 64372: // Lifebloom
21342 case 68285: // Improved Leader of the Pack
21343 return true;
21344 case 54428: // Divine Plea - only with talent Guarded by the Light
21345 return HasSpell(53583);
21346 default:
21347 break;
21348 }
21349
21350 return false;
21351}
virtual bool HasSpell(uint32) const
Definition Unit.h:1567

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSparringWith()

bool Unit::CanSparringWith ( Unit const *  attacker) const
protected
3984{
3986 return false;
3987
3988 if (!attacker)
3989 return false;
3990
3991 if (!attacker->IsCreature() || attacker->IsCharmedOwnedByPlayerOrPlayer())
3992 return false;
3993
3994 if (Creature const* creature = ToCreature())
3995 if (!creature->GetSparringPct())
3996 return false;
3997
3998 return true;
3999}
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition Unit.h:1294

References IsCharmedOwnedByPlayerOrPlayer(), Object::IsCreature(), and Object::ToCreature().

Referenced by AttackerStateUpdate(), and DealDamage().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

19941{
19942 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
19944 return false;
19946 return true;
19948 return false;
19950 return true;
19952}
@ UNIT_FLAG2_UNUSED_6
Definition UnitDefines.h:311
@ UNIT_FLAG_CANNOT_SWIM
Definition UnitDefines.h:268
@ UNIT_FLAG_POSSESSED
Definition UnitDefines.h:278
@ UNIT_FLAG_SWIMMING
Definition UnitDefines.h:269
@ UNIT_FLAG_RENAME
Definition UnitDefines.h:258
@ UNIT_FLAG_PET_IN_COMBAT
Definition UnitDefines.h:265
bool HasUnitFlag2(UnitFlags2 flags) const
Definition Unit.h:743

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by PathGenerator::BuildPolyPath(), and Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/5]

SpellCastResult Unit::CastCustomSpell ( SpellInfo const *  spellInfo,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1290{
1291 SpellCastTargets targets;
1292 targets.SetUnitTarget(victim);
1293
1294 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1295}
Definition Spell.h:119
void SetUnitTarget(Unit *target)
Definition Spell.cpp:238

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastCustomSpell() [2/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1278{
1279 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1280 if (!spellInfo)
1281 {
1282 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1284 }
1285
1286 return CastCustomSpell(spellInfo, value, victim, triggerFlags, castItem, triggeredByAura, originalCaster);
1287}
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition SharedDefines.h:1067
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1251

References CastCustomSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [3/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1264{
1265 CustomSpellValues values;
1266 values.AddSpellMod(mod, value);
1267 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1268}
@ TRIGGERED_NONE
Definition SpellDefines.h:133
Definition SpellDefines.h:165
void AddSpellMod(SpellValueMod mod, int32 value)
Definition SpellDefines.h:167

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [4/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1271{
1272 CustomSpellValues values;
1273 values.AddSpellMod(mod, value);
1274 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1275}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [5/5]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1252{
1253 CustomSpellValues values;
1254 if (bp0)
1255 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1256 if (bp1)
1257 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1258 if (bp2)
1259 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1260 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1261}
@ SPELLVALUE_BASE_POINT1
Definition SpellDefines.h:114
@ SPELLVALUE_BASE_POINT2
Definition SpellDefines.h:115
@ SPELLVALUE_BASE_POINT0
Definition SpellDefines.h:113

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), CastCustomSpell(), CastCustomSpell(), CastCustomSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_illidari_council_memberAI::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_krik_thir::boss_krik_thirAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_reflective_shield_aura::HandleAfterEffectAbsorb(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_soul_deflection::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_gluth_decimate::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), spell_illidari_council_circle_of_healing::HandleSharedRule(), HandleSpellClick(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_sathrovarr::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_felblood_kaelthas::JustEngagedWith(), boss_kalecgos::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_felmyst::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_janalai_hatcher::MovementInform(), npc_frost_tomb::npc_frost_tomb(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), npc_wild_wyrm::PassengerBoarded(), spell_karazhan_overload_aura::PeriodicTick(), spell_entropius_negative_energy_periodic::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), SmartScript::ProcessAction(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), boss_kiljaeden::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_kiljaeden::ScheduleBasicAbilities(), boss_magtheridon::ScheduleCombatEvents(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), npc_coren_direbrew::UpdateAI(), boss_huhuran::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_living_constellation::npc_living_constellationAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20282{
20283 AuraEffect* aurEff = nullptr;
20284 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20285 {
20286 aurEff = *i;
20287 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20288 continue;
20289
20290 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20291 break;
20292 }
20293
20294 // xinef: delay only for casting on different unit
20295 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20296 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, aurEff, caster->GetGUID());
20297 else
20298 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId, aurEff, auraType), caster->m_Events.CalculateQueueTime(400));
20299}
TriggerCastFlags
Definition SpellDefines.h:132
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition SpellDefines.h:152
@ CONFIG_MUNCHING_BLIZZLIKE
Definition WorldConfig.h:144
uint32 GetTickNumber() const
Definition SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition SpellAuraEffects.h:115
uint32 GetId() const
Definition SpellAuraEffects.cpp:432
int32 GetTotalTicks() const
Definition SpellAuraEffects.cpp:7384
ObjectGuid GetCasterGUID() const
Definition SpellAuraEffects.h:48
Definition Unit.cpp:20248
uint64 CalculateQueueTime(uint64 delay) const
Definition EventProcessor.cpp:164
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true, uint8 eventGroup=0)
Definition EventProcessor.cpp:136

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), WorldObject::m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17566{
17567 uint32 auraId = aura->GetAura(GetEntry());
17568 if (!auraId)
17569 return;
17570
17571 if (auraId == 35696) // Demonic Knowledge
17572 {
17573 int32 basePoints = aura->GetDamage();
17574 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17575 }
17576 else
17577 CastSpell(this, auraId, true);
17578}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1298{
1299 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1300 if (!spellInfo)
1301 {
1302 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1304 }
1305
1306 SpellCastTargets targets;
1307 targets.SetDst(x, y, z, GetOrientation());
1308
1309 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1310}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition Spell.cpp:405

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1313{
1314 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1315 if (!spellInfo)
1316 {
1317 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1319 }
1320
1321 SpellCastTargets targets;
1322 targets.SetGOTarget(go);
1323
1324 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1325}
void SetGOTarget(GameObject *target)
Definition Spell.cpp:270

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1195{
1196 if (!spellInfo)
1197 {
1198 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1200 }
1201
1203 if (!originalCaster && triggeredByAura)
1204 {
1205 originalCaster = triggeredByAura->GetCasterGUID();
1206 }
1207
1208 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1209
1210 if (value)
1211 {
1212 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1213 {
1214 spell->SetSpellValue(itr->first, itr->second);
1215 }
1216 }
1217
1218 spell->m_CastItem = castItem;
1219 return spell->prepare(&targets, triggeredByAura);
1220}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition Spell.cpp:8427
Item * m_CastItem
Definition Spell.h:532

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_the_cleansing_cleansing_soul::AfterRemove(), spell_astromancer_wrath_of_the_astromancer::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), Player::ApplyItemObtainSpells(), spell_hun_lock_and_load::ApplyMarker(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::boss_yoggsaron_crusher_tentacleAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::boss_yoggsaron_death_orbAI(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::boss_yoggsaron_influence_tentacleAI(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), CastSpell(), CastSpell(), GameObject::CastSpell(), CastSpell(), CastSpell(), CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_jenny::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), DealMeleeDamage(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_flame_leviathan::boss_flame_leviathanAI::DoAction(), boss_magtheridon::DoAction(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), npc_kalecgos_kj::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::DoAction(), npc_molten_golem::DoAction(), boss_steelbreaker::boss_steelbreakerAI::DoAction(), npc_ulduar_bot_summon_trigger::npc_ulduar_bot_summon_triggerAI::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DoAction(), boss_yoggsaron_keeper::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CorruptTriggers::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), npc_pet_dk_ebon_gargoyle::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_braziers_hit::HandleAfterEffectApply(), spell_infected_worgen_bite_aura::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_mirkblood_dash_gash_return_to_tank_pre_spell::HandleCast(), spell_rotface_unstable_ooze_explosion_init::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::HandleDummy(), spell_player_mount_wyrm::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_fatal_strike::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits_aura::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_call_of_the_beast::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_lich_king_vo_blocker::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_serpentshrine_cavern_coilfang_water::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_bloodspore_haze::HandleEffectHit(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), OPvPCapturePointZM_Graveyard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_magtheridon_quake::HandleHit(), spell_chapter5_return_to_capital::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), WorldState::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_karazhan_wrath_titans_aura::HandleProc(), spell_ahune_spanky_hands::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_gen_translocate::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_yogg_saron_target_selectors::HandleScript(), spell_the_cleansing_shrine_cast::HandleScript(), spell_the_cleansing_mirror_image_script_effect::HandleScript(), spell_low_health_trigger::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_summon_amanishi_sentries::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_azjol_drain_power::HandleScriptEffect(), spell_dtk_summon_random_drakkari::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_dragonblight_devour_ghoul::HandleScriptEffect(), spell_hawk_hunting::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect(), spell_kaelthas_kael_explodes::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_alert_drums::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InitFight(), npc_jenny::Initialize(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), boss_steelbreaker::boss_steelbreakerAI::JustDied(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_freya_summons::boss_freya_summonsAI::JustDied(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::JustDied(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::JustDied(), boss_skarvald_the_constructor::JustDied(), boss_dalronn_the_controller::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), npc_necropolis_health::JustDied(), npc_necrotic_shard::JustDied(), CombatAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_freya_summons::boss_freya_summonsAI::JustEngagedWith(), boss_vezax::boss_vezaxAI::JustEngagedWith(), boss_hodir::boss_hodirAI::JustEngagedWith(), boss_thorim::boss_thorimAI::JustEngagedWith(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::JustReachedHome(), boss_freya::boss_freyaAI::JustSummoned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::boss_malygosAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_pallid_horror::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::boss_anubrekhanAI::KilledUnit(), boss_doomwalker::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::boss_steelbreakerAI::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::MovementInform(), npc_ashtongue_sorcerer::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::npc_assembly_lightningAI::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::npc_algalon_worm_holeAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tomb(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_power_spark::npc_power_sparkAI::npc_power_sparkAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::npc_ulduar_iron_constructAI(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fireAI::npc_ulduar_toasty_fireAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), spell_shadowfang_keep_forsaken_skills_aura::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), spell_summon_all_players_dummy::OnHit(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_claw_rage_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_kalecgos_curse_of_boundless_agony_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_gen_proc_on_victim::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_dragonblight_devour_ghoul_periodic::OnRemove(), spell_kaelthas_flame_strike::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_q12937_relief_for_the_fallen::OnRemove(), spell_claw_swipe_check::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), npc_frosthound::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetles::PrepareAuraScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::RemovePassengers(), boss_keristrasza::RemovePrison(), Player::ReportedAfkBy(), npc_demonic_vapor::Reset(), npc_demonic_vapor_trail::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_freya_lifebinder::boss_freya_lifebinderAI::Reset(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::Reset(), boss_freya_nature_bomb::boss_freya_nature_bombAI::Reset(), boss_thorim_lightning_orb::boss_thorim_lightning_orbAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::Reset(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_yoggsaron_voice::boss_yoggsaron_voiceAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_ashtongue_channeler::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::npc_xt002_heartAI::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_cultist_engineer::sGossipSelect(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_necropolis_relay::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), boss_thorim_pillar::boss_thorim_pillarAI::SpellHit(), npc_necropolis_proxy::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::npc_living_constellationAI::SpellHit(), boss_ignis::boss_ignisAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_magus_telestra::SpellHit(), boss_thorim::boss_thorimAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), boss_felmyst::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::boss_hodirAI::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::npc_ulduar_rocket_strike_triggerAI::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), npc_overlord_drakuru_betrayal::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritOfCompetitionEvent(), boss_heigan::StartFightPhase(), npc_finklestein::npc_finklesteinAI::StartNextTask(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(), boss_cthun::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_sartharion::boss_sartharionAI::SummonLavaWaves(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), spell_igb_check_for_players::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists_aura::TriggerFists(), spell_flame_warder_meteor_fists_aura::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_item_brewfest_hops::Update(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_demonic_vapor::UpdateAI(), npc_demonic_vapor_trail::UpdateAI(), npc_kalecgos_kj::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), npc_alexstrasza::npc_alexstraszaAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), npc_crystal_spike::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_saronite_animus::npc_ulduar_saronite_animusAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_icicle::npc_ulduar_icicleAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_proximity_mine::npc_ulduar_proximity_mineAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_thassarian::npc_thassarianAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_living_poison::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1240{
1241 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1242}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1245{
1246 SpellCastTargets targets;
1247 targets.SetUnitTarget(victim);
1248 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1249}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1223{
1224 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1225}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1228{
1229 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1230 if (!spellInfo)
1231 {
1232 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1234 }
1235
1236 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1237}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19695{
19696 if (!m_vehicle)
19697 return;
19698
19699 if (seatId < 0)
19700 {
19701 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19702 if (seatId < 0)
19703 return;
19704 }
19705 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19706 return;
19707
19709 if (!m_vehicle->AddPassenger(this, seatId))
19710 ABORT();
19711}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition Vehicle.cpp:246
bool HasEmptySeat(int8 seatId) const
Definition Vehicle.cpp:220

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CheckAttackFitToAuraRequirement()

virtual bool Unit::CheckAttackFitToAuraRequirement ( WeaponAttackType  ,
AuraEffect const *   
) const
inlinevirtual

Reimplemented in Player.

1072{ return true; }

Referenced by UpdateDamageDoneMods(), UpdateDamagePctDoneMods(), and Player::UpdateWeaponDependentCritAuras().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15964{
15966 return;
15967
15968 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15970
15971 if (IsInWorld()) // not in world and not being removed atm
15973
15974 ASSERT(GetGUID());
15975
15976 // A unit may be in removelist and not in world, but it is still in grid
15977 // and may have some references during delete
15980
15981 if (finalCleanup)
15982 m_cleanupDone = true;
15983
15984 CombatStop();
15989 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15990}
void deleteReferences(bool removeFromMap=false)
Definition HostileRefMgr.cpp:125
void Clear(bool reset=true)
Definition MotionMaster.h:192
void ClearAllThreat()
Definition ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition Unit.cpp:10640
void RemoveAllGameObjects()
Definition Unit.cpp:6490
void ClearComboPoints()
Definition Unit.cpp:17096
void ClearComboPointHolders()
Definition Unit.cpp:17151
HostileRefMgr & getHostileRefMgr()
Definition Unit.h:947
void RemoveFromWorld() override
Definition Unit.cpp:15917
void RemoveAllAuras()
Definition Unit.cpp:5438
ThreatMgr & GetThreatMgr()
Definition Unit.h:943

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), m_cleanupDone, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

15993{
15994 if (GetTransport())
15995 {
15997 SetTransport(nullptr);
16000 }
16001
16002 CleanupBeforeRemoveFromMap(finalCleanup);
16003}
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition Unit.cpp:15963
void SetTransport(Transport *t)
Definition Object.h:690
void Reset()
Definition Object.h:298
void RemoveMovementFlag(uint32 flag)
Definition Object.h:344

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
17160{
17161 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17162 m_reactiveTimer[i] = 0;
17163
17170}
@ CLASS_HUNTER
Definition SharedDefines.h:143
@ CLASS_WARRIOR
Definition SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition SharedDefines.h:1303
@ AURA_STATE_HUNTER_PARRY
Definition SharedDefines.h:1309
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition UnitDefines.h:239
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition Unit.h:834
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:10751

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
17152{
17153 while (!m_ComboPointHolders.empty())
17154 {
17155 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
17156 }
17157}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
17097{
17098 if (!m_comboTarget)
17099 {
17100 return;
17101 }
17102
17103 // remove Premed-like effects
17104 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
17106
17107 m_comboPoints = 0;
17110 m_comboTarget = nullptr;
17111}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
1842{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearEmoteState()

void Unit::ClearEmoteState ( )
inline

Sets emote state (looping emote). Emotes available in SharedDefines.h.

void SetEmoteState(Emote emoteState)
Definition Unit.h:748

References EMOTE_ONESHOT_NONE, and SetEmoteState().

Referenced by boss_felblood_kaelthas::DoAction().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13968{
13969 m_CombatTimer = 0;
13971
13972 // Player's state will be cleared in Player::UpdateContestedPvP
13973 if (Creature* creature = ToCreature())
13974 {
13975 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13976 SetImmuneToPC(true); // set immunity state to the one from db on evade
13977
13980 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13981
13982 creature->SetAssistanceTimer(0);
13983
13984 // Xinef: will be recalculated at follow movement generator initialization
13985 if (!IsPet() && !IsCharmed())
13986 return;
13987 }
13988 else if (Player* player = ToPlayer())
13989 {
13990 player->UpdatePotionCooldown();
13991 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
13992 for (uint8 i = 0; i < MAX_RUNES; ++i)
13993 player->SetGracePeriod(i, 0);
13994 }
13995
13996 if (Player* player = this->ToPlayer())
13997 {
13998 sScriptMgr->OnPlayerLeaveCombat(player);
13999 }
14000}
#define MAX_RUNES
Definition Player.h:394
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ CLASS_CONTEXT_ABILITY
Definition UnitDefines.h:238
@ UNIT_STATE_ATTACK_PLAYER
Definition UnitDefines.h:184
@ UNIT_FLAG_IN_COMBAT
Definition UnitDefines.h:273
@ UNIT_FLAG_IMMUNE_TO_PC
Definition UnitDefines.h:262
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:759
bool IsCharmed() const
Definition Unit.h:1295
bool IsPet() const
Definition Unit.h:787
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13759
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:739

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
727{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::boss_thorimAI::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_loken::OnAuraRemove(), boss_nightbane::PathEndReached(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), boss_loken::ScheduleTasks(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SetClientControl(), SmartAI::SetCombatMovement(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), SetRooted(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13778{
13779 // Xinef: Dont allow to start combat with triggers
13780 if (victim->IsCreature() && victim->ToCreature()->IsTrigger())
13781 return;
13782
13783 if (initialAggro)
13784 {
13785 // Make player victim stand up automatically
13786 if (victim->getStandState() && victim->IsPlayer())
13787 {
13788 victim->SetStandState(UNIT_STAND_STATE_STAND);
13789 }
13790
13791 if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13792 {
13793 if (victim->IsPet())
13794 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13795 else
13796 {
13797 victim->ToCreature()->AI()->AttackStart(this);
13798 // if the target is an NPC with a pet or minion, pet should react.
13799 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13800 {
13801 victimControlledUnit->SetInCombatWith(this);
13802 SetInCombatWith(victimControlledUnit);
13803 victimControlledUnit->AddThreat(this, 0.0f);
13804 }
13805 }
13806
13807 // if unit has an owner, put owner in combat.
13808 if (Unit* victimOwner = victim->GetOwner())
13809 {
13810 if (!(victimOwner->IsInCombatWith(this)))
13811 {
13812 /* warding off to not take over aggro for no reason
13813 Using only AddThreat causes delay in attack */
13814 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13815 {
13816 victimOwner->ToCreature()->AI()->AttackStart(this);
13817 }
13818 victimOwner->SetInCombatWith(this);
13819 SetInCombatWith(victimOwner);
13820 victimOwner->AddThreat(this, 0.0f);
13821 }
13822 }
13823 }
13824
13825 bool alreadyInCombat = IsInCombat();
13826
13827 SetInCombatWith(victim);
13828 victim->SetInCombatWith(this);
13829
13830 // Update leash timer when attacking creatures
13831 if (victim->IsCreature() && this != victim)
13832 victim->ToCreature()->UpdateLeashExtensionTime();
13833
13834 // Xinef: If pet started combat - put owner in combat
13835 if (!alreadyInCombat && IsInCombat())
13836 {
13837 if (Unit* owner = GetOwner())
13838 {
13839 owner->SetInCombatWith(victim);
13840 victim->SetInCombatWith(owner);
13841 }
13842 }
13843 }
13844
13845 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13846 if (who->IsPlayer())
13847 SetContestedPvP(who->ToPlayer());
13848
13850 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13851 {
13852 player->UpdatePvP(true);
13854 }
13855}
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition SpellDefines.h:66
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:32
@ REACT_PASSIVE
Definition Unit.h:555
void UpdatePvP(bool state, bool _override=false)
Definition PlayerUpdates.cpp:1529
Unit * GetCharmerOrOwnerOrSelf() const
Definition Unit.h:1272
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition Unit.cpp:17492
Unit * GetFirstControlled() const
Definition Unit.cpp:11283

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), UNIT_STAND_STATE_STAND, Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13858{
13859 // Xinef: Dont allow to start combat with triggers
13860 if (target->IsCreature() && target->ToCreature()->IsTrigger())
13861 return;
13862
13863 if (initialAggro)
13864 {
13865 SetInCombatWith(target, duration);
13866
13867 // Xinef: If pet started combat - put owner in combat
13868 if (Unit* owner = GetOwner())
13869 owner->SetInCombatWith(target, duration);
13870
13871 // Update leash timer when attacking creatures
13872 if (target->IsCreature())
13874 else if (ToCreature()) // Reset leash if it is a spell caster, else it may evade inbetween casts
13876 }
13877
13878 Unit* who = target->GetCharmerOrOwnerOrSelf();
13879 if (who->IsPlayer())
13880 SetContestedPvP(who->ToPlayer());
13881
13883 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13884 {
13885 player->UpdatePvP(true);
13887 }
13888}
bool IsTrigger() const
Definition Creature.h:80

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10641{
10642 if (includingCast && IsNonMeleeSpellCast(false))
10644
10645 AttackStop();
10647 if (IsPlayer())
10648 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10649 if (Creature* pCreature = ToCreature())
10650 pCreature->ClearLastLeashExtensionTimePtr();
10651 ClearInCombat();
10652
10653 // xinef: just in case
10654 if (IsPetInCombat() && !IsPlayer())
10656}
void SendAttackSwingCancelAttack()
Definition PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition Unit.h:927
void ClearInPetCombat()
Definition Unit.cpp:14002
void RemoveAllAttackers()
Remove all units in m_attackers list and send them AttackStop()
Definition Unit.cpp:10688
void ClearInCombat()
Definition Unit.cpp:13967
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:10607

References AttackStop(), ClearInCombat(), ClearInPetCombat(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), Object::IsPlayer(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToCreature(), and Object::ToPlayer().

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_kalecgos::DoAction(), npc_spark_of_ionar::DoAction(), npc_maiev_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10659{
10660 CombatStop(includingCast);
10661
10662 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10663 (*itr)->CombatStop(includingCast);
10664}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
1107{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition Unit.h:1093

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm_aura::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
1106{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition Unit.h:1094

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::KilledUnit(), Pet::LoadPetFromDB(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17596{
17597 if (!IsPlayer())
17598 return nullptr;
17599
17600 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17601
17602 if (!pet->CreateBaseAtCreature(creatureTarget))
17603 {
17604 delete pet;
17605 return nullptr;
17606 }
17607
17608 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17609
17610 if (!InitTamedPet(pet, level, spell_id))
17611 {
17612 delete pet;
17613 return nullptr;
17614 }
17615
17616 return pet;
17617}
@ HUNTER_PET
Definition PetDefines.h:33
bool CreateBaseAtCreature(Creature *creature)
Definition Pet.cpp:941
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition Unit.cpp:17639

References Pet::CreateBaseAtCreature(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), and Object::ToPlayer().

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17620{
17621 if (!IsPlayer())
17622 return nullptr;
17623
17624 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17625 if (!creatureInfo)
17626 return nullptr;
17627
17628 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17629
17630 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17631 {
17632 delete pet;
17633 return nullptr;
17634 }
17635
17636 return pet;
17637}
#define sObjectMgr
Definition ObjectMgr.h:1650
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition Pet.cpp:976
Definition CreatureData.h:186

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), sObjectMgr, and Object::ToPlayer().

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

18963{
18964 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18965 if (!vehInfo)
18966 return false;
18967
18968 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18971 return true;
18972}
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)
@ UNIT_MASK_VEHICLE
Definition UnitDefines.h:161
@ UPDATEFLAG_VEHICLE
Definition UpdateData.h:46

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static

@fix: Hack to avoid premature leashing

825{
826 damage = sScriptMgr->DealDamage(attacker, victim, damage, damagetype);
827 // Xinef: initialize damage done for rage calculations
828 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
829 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
830
831 //if (attacker)
832 {
833 if (victim->IsAIEnabled)
834 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
835
836 if (attacker && attacker->IsAIEnabled)
837 attacker->GetAI()->DamageDealt(victim, damage, damagetype, damageSchoolMask);
838 }
839
840 // Hook for OnDamage Event
841 sScriptMgr->OnDamage(attacker, victim, damage);
842
843 if (victim->IsPlayer() && attacker != victim)
844 {
845 // Signal to pets that their owner was attacked
846 Pet* pet = victim->ToPlayer()->GetPet();
847
848 if (pet && pet->IsAlive())
849 pet->AI()->OwnerAttackedBy(attacker);
850 }
851
852 //Dont deal damage to unit if .cheat god is enable.
853 if (victim->IsPlayer())
854 {
855 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
856 {
857 return 0;
858 }
859 }
860
861 // Signal the pet it was attacked so the AI can respond if needed
862 if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive())
863 victim->ToPet()->AI()->AttackedBy(attacker);
864
865 if (damagetype != NODAMAGE)
866 {
867 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
868 if (spellProto)
869 {
870 if (attacker && damagetype != DOT && spellProto->DmgClass == SPELL_DAMAGE_CLASS_MELEE && !(spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_HOLY))
871 attacker->DealDamageShieldDamage(victim);
872
873 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
875 }
876 else
878
879 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
880 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
881 {
882 if (victim != attacker && victim->IsPlayer())
883 {
884 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
885 {
886 if (spell->getState() == SPELL_STATE_PREPARING)
887 {
888 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
889 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
890 {
891 victim->InterruptNonMeleeSpells(false);
892 }
893 }
894 }
895 }
896 }
897
898 // We're going to call functions which can modify content of the list during iteration over it's elements
899 // Let's copy the list so we can prevent iterator invalidation
901 // copy damage to casters of this aura
902 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
903 {
904 // Check if aura was removed during iteration - we don't need to work on such auras
905 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
906 continue;
907 // check damage school mask
908 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
909 continue;
910
911 Unit* shareDamageTarget = (*i)->GetCaster();
912 if (!shareDamageTarget)
913 continue;
914 SpellInfo const* spell = (*i)->GetSpellInfo();
915
916 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
917
918 uint32 shareAbsorb = 0;
919 uint32 shareResist = 0;
920
921 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
922 {
923 shareAbsorb = shareDamage;
924 shareDamage = 0;
925 }
926 else
927 {
928 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
929 Unit::CalcAbsorbResist(sharedDamageInfo, true);
930 shareAbsorb = sharedDamageInfo.GetAbsorb();
931 shareResist = sharedDamageInfo.GetResist();
932 shareDamage = sharedDamageInfo.GetDamage();
933 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
934 }
935
936 if (attacker && shareDamageTarget->IsPlayer())
937 {
938 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
939 }
940
941 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
942 }
943 }
944
945 // Rage from Damage made (only from direct weapon damage)
946 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->HasActivePowerType(POWER_RAGE))
947 {
948 uint32 weaponSpeedHitFactor;
949
950 switch (cleanDamage->attackType)
951 {
952 case BASE_ATTACK:
953 case OFF_ATTACK:
954 {
955 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
956 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
957 weaponSpeedHitFactor *= 2;
958
959 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
960 break;
961 }
962 case RANGED_ATTACK:
963 break;
964 default:
965 break;
966 }
967 }
968
969 if (!damage)
970 {
971 // Rage from absorbed damage
972 if (cleanDamage && cleanDamage->absorbed_damage)
973 {
974 if (victim->HasActivePowerType(POWER_RAGE))
975 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
976
977 if (attacker && attacker->HasActivePowerType(POWER_RAGE))
978 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
979 }
980
981 return 0;
982 }
983
984 LOG_DEBUG("entities.unit", "DealDamageStart");
985
986 uint32 health = victim->GetHealth();
987 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
988
989 // duel ends when player has 1 or less hp
990 bool duel_hasEnded = false;
991 bool duel_wasMounted = false;
992 if (victim->IsPlayer() && victim->ToPlayer()->duel && damage >= (health - 1))
993 {
994 // xinef: situation not possible earlier, just return silently.
995 if (!attacker)
996 return 0;
997
998 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
999 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
1000 damage = health - 1;
1001
1002 duel_hasEnded = true;
1003 }
1004 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->IsPlayer())
1005 {
1006 Player* victimRider = victim->GetCharmer()->ToPlayer();
1007
1008 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
1009 {
1010 // xinef: situation not possible earlier, just return silently.
1011 if (!attacker)
1012 return 0;
1013
1014 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
1015 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
1016 damage = health - 1;
1017
1018 duel_wasMounted = true;
1019 duel_hasEnded = true;
1020 }
1021 }
1022
1023 if (attacker && attacker != victim)
1024 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
1025 {
1026 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
1027 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
1028 // return 0;
1029
1030 if (Battleground* bg = killer->GetBattleground())
1031 {
1032 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1033 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1034 }
1035 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1036 }
1037
1038 if (victim->IsPlayer())
1039 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1040 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1041 {
1042 if (!victim->ToCreature()->hasLootRecipient())
1043 victim->ToCreature()->SetLootRecipient(attacker);
1044
1045 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1046 {
1047 uint32 unDamage = health < damage ? health : damage;
1048 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1049 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1050 }
1051 }
1052
1053 // Sparring
1054 if (victim->CanSparringWith(attacker))
1055 {
1056 if (damage >= victim->GetHealth())
1057 damage = 0;
1058
1059 uint32 sparringHealth = victim->GetHealth() * (victim->ToCreature()->GetSparringPct() / 100);
1060 if (victim->GetHealth() - damage <= sparringHealth)
1061 damage = 0;
1062 }
1063
1064 if (health <= damage)
1065 {
1066 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1067
1068 //if (attacker && victim->IsPlayer() && victim != attacker)
1069 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1070 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1071 }
1072 else
1073 {
1074 LOG_DEBUG("entities.unit", "DealDamageAlive");
1075
1076 //if (victim->IsPlayer())
1077 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1078
1079 victim->ModifyHealth(- (int32)damage);
1080
1081 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1082 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1083
1084 if (!victim->IsPlayer())
1085 {
1087 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1089
1090 if (attacker && attacker != victim)
1091 {
1092 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1093 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPPRESS_TARGET_PROCS));
1094
1095 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1096 }
1097 }
1098 else // victim is a player
1099 {
1100 // random durability for items (HIT TAKEN)
1102 {
1105 }
1106 }
1107
1108 // Rage from damage received
1109 if (attacker != victim && victim->HasActivePowerType(POWER_RAGE))
1110 {
1111 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1112 victim->RewardRage(rageDamage, 0, false);
1113 }
1114
1115 if (attacker && attacker->IsPlayer())
1116 {
1117 // random durability for items (HIT DONE)
1119 {
1121 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1122 }
1123 }
1124
1125 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1126 {
1127 if (victim != attacker && victim->IsPlayer()) // does not support creature push_back
1128 {
1129 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1130 {
1131 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1132 {
1133 if (spell->getState() == SPELL_STATE_PREPARING)
1134 {
1135 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1136 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1137 {
1138 victim->InterruptNonMeleeSpells(false);
1139 }
1140 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1141 {
1142 spell->Delayed();
1143 }
1144 }
1145 }
1146
1147 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1148 if (spell->getState() == SPELL_STATE_CASTING)
1149 {
1150 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1151 {
1152 spell->DelayedChannel();
1153 }
1154 }
1155 }
1156 }
1157 }
1158
1159 // last damage from duel opponent
1160 if (duel_hasEnded)
1161 {
1162 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1163
1164 ASSERT_NODEBUGINFO(he && he->duel);
1165
1166 if (duel_wasMounted) // In this case victim==mount
1167 victim->SetHealth(1);
1168 else
1169 he->SetHealth(1);
1170
1171 he->duel->Opponent->CombatStopWithPets(true);
1172 he->CombatStopWithPets(true);
1173
1174 he->CastSpell(he, 7267, true); // beg
1176 }
1177 }
1178
1179 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1180
1181 return damage;
1182}
@ SCORE_DAMAGE_DONE
Definition BattlegroundScore.h:32
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition DBCEnums.h:130
#define ASSERT_NODEBUGINFO
Definition Errors.h:69
@ CHEAT_GOD
Definition Player.h:994
EquipmentSlots
Definition Player.h:668
@ EQUIPMENT_SLOT_END
Definition Player.h:689
bool roll_chance_f(float chance)
Definition Random.h:57
@ POWER_RAGE
Definition SharedDefines.h:281
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition SharedDefines.h:658
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition SharedDefines.h:529
@ SPELL_ATTR3_SUPPRESS_TARGET_PROCS
Definition SharedDefines.h:521
@ DUEL_WON
Definition SharedDefines.h:3879
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition SharedDefines.h:555
@ SPELL_AURA_DAMAGE_SHIELD
Definition SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition SpellAuraDefines.h:363
@ CHANNEL_FLAG_DELAY
Definition SpellDefines.h:38
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition SpellDefines.h:44
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition SpellDefines.h:67
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition SpellDefines.h:30
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition SpellDefines.h:27
@ SPELL_STATE_PREPARING
Definition Spell.h:235
@ SPELL_STATE_CASTING
Definition Spell.h:236
@ NODAMAGE
Definition Unit.h:259
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:546
@ CURRENT_GENERIC_SPELL
Definition Unit.h:545
@ RATE_DURABILITY_LOSS_DAMAGE
Definition WorldConfig.h:479
virtual void OwnerAttackedBy(Unit *)
Definition CreatureAI.h:177
virtual void AttackedBy(Unit *)
Definition CreatureAI.h:154
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition Creature.cpp:1329
bool hasLootRecipient() const
Definition Creature.h:234
float GetSparringPct() const
Definition Creature.h:191
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition Creature.cpp:3733
bool IsPlayer() const
Definition ObjectGuid.h:168
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2163
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition Player.cpp:4807
Pet * GetPet() const
Definition Player.cpp:8997
bool GetCommandStatus(uint32 command) const
Definition Player.h:1184
uint32 ChannelInterruptFlags
Definition SpellInfo.h:354
uint32 InterruptFlags
Definition SpellInfo.h:352
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage to any victim (before damage apply)
Definition UnitAI.h:361
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage from any attacker (before damage apply)
Definition UnitAI.h:368
int32 ModifyHealth(int32 val)
Definition Unit.cpp:14264
Pet * ToPet()
Definition Unit.h:719
bool IsCreatedByPlayer() const
Definition Unit.h:1293
Unit * GetCharmer() const
Definition Unit.cpp:10812
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition Unit.cpp:17960
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition Unit.cpp:20111
void SetHealth(uint32 val)
Definition Unit.cpp:15713
ObjectGuid GetCharmerGUID() const
Definition Unit.h:709
void DealDamageShieldDamage(Unit *victim)
Definition Unit.cpp:1982
virtual bool HasActivePowerType(Powers power)
Definition Unit.h:1117
void CombatStopWithPets(bool includingCast=false)
Definition Unit.cpp:10658

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CanSparringWith(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DealDamageShieldDamage(), DIRECT_DAMAGE, SpellInfo::DmgClass, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), Creature::GetSparringPct(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), Object::IsCreature(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_SCHOOL_MASK_HOLY, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), Creature::UpdateLeashExtensionTime(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealDamageShieldDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), npc_necrotic_shard::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

void Unit::DealDamageMods ( Unit const *  victim,
uint32 damage,
uint32 absorb 
)
static

◆ DealDamageShieldDamage()

void Unit::DealDamageShieldDamage ( Unit victim)
Todo:
: Move this to a packet handler
1983{
1984 // We're going to call functions which can modify content of the list during iteration over it's elements
1985 // Let's copy the list so we can prevent iterator invalidation
1987 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1988 {
1989 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1990 // Damage shield can be resisted...
1991 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1992 {
1993 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1994 continue;
1995 }
1996
1997 // ...or immuned
1998 if (IsImmunedToDamageOrSchool(i_spellProto))
1999 {
2000 victim->SendSpellDamageImmune(this, i_spellProto->Id);
2001 continue;
2002 }
2003
2004 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
2005
2006 if (Unit* caster = (*dmgShieldItr)->GetCaster())
2007 {
2008 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
2009 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
2010 }
2011
2012 uint32 absorb = 0;
2013
2014 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
2015 Unit::CalcAbsorbResist(dmgInfo);
2016 absorb = dmgInfo.GetAbsorb();
2017 damage = dmgInfo.GetDamage();
2018
2019 Unit::DealDamageMods(this, damage, &absorb);
2020
2022 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
2023 data << victim->GetGUID();
2024 data << GetGUID();
2025 data << uint32(i_spellProto->Id);
2026 data << uint32(damage); // Damage
2027 int32 overkill = int32(damage) - int32(GetHealth());
2028 data << uint32(overkill > 0 ? overkill : 0); // Overkill
2029 data << uint32(i_spellProto->GetSchoolMask());
2030 victim->SendMessageToSet(&data, true);
2031
2032 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
2033 }
2034}
SpellMissInfo
Definition SharedDefines.h:1529
SpellSchoolMask GetSchoolMask() const
Definition SpellInfo.cpp:1878
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition Unit.cpp:6672
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition Unit.cpp:6696
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition Unit.cpp:3508
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition Unit.cpp:11993
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition Object.cpp:2083
@ SMSG_SPELLDAMAGESHIELD
Definition Opcodes.h:621

References CalcAbsorbResist(), DealDamage(), DealDamageMods(), DamageInfo::GetAbsorb(), GetAuraEffectsByType(), DamageInfo::GetDamage(), Object::GetGUID(), Object::GetGUID(), GetHealth(), SpellInfo::GetSchoolMask(), SpellInfo::Id, IsImmunedToDamageOrSchool(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), and SpellHitResult().

Referenced by DealDamage(), and DealMeleeDamage().

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
11160{
11161 int32 gain = 0;
11162
11163 if (healer)
11164 {
11165 if (victim->IsAIEnabled)
11166 victim->GetAI()->HealReceived(healer, addhealth);
11167
11168 if (healer->IsAIEnabled)
11169 healer->GetAI()->HealDone(victim, addhealth);
11170 }
11171
11172 if (addhealth)
11173 gain = victim->ModifyHealth(int32(addhealth));
11174
11175 // Hook for OnHeal Event
11176 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
11177
11178 Unit* unit = healer;
11179
11180 if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem())
11181 unit = healer->GetOwner();
11182
11183 if (!unit)
11184 return gain;
11185
11186 if (Player* player = unit->ToPlayer())
11187 {
11188 if (Battleground* bg = player->GetBattleground())
11189 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
11190
11191 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
11192 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
11193 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
11194
11195 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
11196 }
11197
11198 /*if (Player* player = victim->ToPlayer())
11199 {
11200 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
11201 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
11202 }*/
11203
11204 return gain;
11205}
@ SCORE_HEALING_DONE
Definition BattlegroundScore.h:33
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition DBCEnums.h:169
virtual void HealReceived(Unit *, uint32 &)
Called when the creature receives heal.
Definition UnitAI.h:371
virtual void HealDone(Unit *, uint32 &)
Called when the unit heals.
Definition UnitAI.h:377

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, Object::IsCreature(), IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), and Object::ToPlayer().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
1862{
1863 Unit* victim = damageInfo->target;
1864
1865 auto canTakeMeleeDamage = [&]()
1866 {
1867 return victim->IsAlive() && !victim->IsInFlight() && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks());
1868 };
1869
1870 if (!canTakeMeleeDamage())
1871 {
1872 return;
1873 }
1874
1875 // Hmmmm dont like this emotes client must by self do all animations
1876 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1878 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1880
1881 // Parry haste is enabled if it's not a creature or if the creature doesn't have the NO_PARRY_HASTEN flag.
1882 bool isParryHasteEnabled = !victim->IsCreature() ||
1884 if (damageInfo->TargetState == VICTIMSTATE_PARRY && isParryHasteEnabled)
1885 {
1886 // Get attack timers
1887 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1888 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1889 // Reduce attack time
1890 if (victim->HasOffhandWeaponForAttack() && offtime < basetime)
1891 {
1892 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1893 float percent60 = 3.0f * percent20;
1894 if (offtime > percent20 && offtime <= percent60)
1895 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1896 else if (offtime > percent60)
1897 {
1898 offtime -= 2.0f * percent20;
1899 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1900 }
1901 }
1902 else
1903 {
1904 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1905 float percent60 = 3.0f * percent20;
1906 if (basetime > percent20 && basetime <= percent60)
1907 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1908 else if (basetime > percent60)
1909 {
1910 basetime -= 2.0f * percent20;
1911 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1912 }
1913 }
1914 }
1915
1916 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1917 {
1918 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1919 {
1920 continue;
1921 }
1922
1923 // Call default DealDamage
1924 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1925 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1926 }
1927
1928 // gain rage if attack is fully blocked, dodged or parried
1930 {
1931 switch (damageInfo->attackType)
1932 {
1933 case BASE_ATTACK:
1934 case OFF_ATTACK:
1935 {
1936 uint32 weaponSpeedHitFactor = uint32(GetAttackTime(damageInfo->attackType) / 1000.0f * (damageInfo->attackType == BASE_ATTACK ? 3.5f : 1.75f));
1937 RewardRage(damageInfo->cleanDamage, weaponSpeedHitFactor, true);
1938 break;
1939 }
1940 default:
1941 break;
1942 }
1943 }
1944
1945 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1946 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1947 !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1948 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1949 {
1950 // -probability is between 0% and 40%
1951 // 20% base chance
1952 float Probability = 20.0f;
1953
1954 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1955 if (victim->GetLevel() < 30)
1956 Probability = 0.65f * victim->GetLevel() + 0.5f;
1957
1958 uint32 VictimDefense = victim->GetDefenseSkillValue();
1960 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1961
1962 // xinef: fix daze mechanics
1963 Probability -= ((float)VictimDefense + (float)VictimAuraDefense - AttackerMeleeSkill) * 0.1428f;
1964
1965 if (Probability > 40.0f)
1966 Probability = 40.0f;
1967
1968 // Daze application
1969 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1970 if (roll_chance_f(std::max(0.0f, Probability)))
1971 CastSpell(victim, 1604, true);
1972 }
1973
1974 if (IsPlayer())
1975 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1976
1977 // Do effect if any damage done to target
1978 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1979 DealDamageShieldDamage(victim);
1980}
@ CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
Definition CreatureData.h:48
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition SharedDefines.h:1935
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition SharedDefines.h:1941
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition SpellAuraDefines.h:250
@ CONFIG_ENABLE_DAZE
Definition WorldConfig.h:145
bool isWorldBoss() const
Definition Creature.h:125
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition Player.cpp:7280
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition Unit.h:1175
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3654
bool IsInFlight() const
Definition Unit.h:1685
void HandleEmoteCommand(uint32 emoteId)
Definition Unit.cpp:2036
bool HasFlagsExtra(uint32 flag) const
Definition CreatureData.h:283
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition Position.cpp:148

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageShieldDamage(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, GetAttackTime(), getAttackTimer(), Creature::GetCreatureTemplate(), GetDefenseSkillValue(), GetLevel(), GetTotalAuraModifier(), GetUnitMeleeSkill(), HandleEmoteCommand(), HasActivePowerType(), CreatureTemplate::HasFlagsExtra(), Position::HasInArc(), HasOffhandWeaponForAttack(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, IsAlive(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, POWER_RAGE, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, RewardRage(), roll_chance_f(), setAttackTimer(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1471{
1472 if (damageInfo == 0)
1473 return;
1474
1475 Unit* victim = damageInfo->target;
1476
1477 if (!victim)
1478 return;
1479
1480 if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()))
1481 return;
1482
1483 SpellInfo const* spellProto = damageInfo->spellInfo;
1484 if (!spellProto)
1485 {
1486 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1487 return;
1488 }
1489
1490 // Call default DealDamage
1491 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1492 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1493}
SpellInfo const * spellInfo
Definition Unit.h:504

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), IsAlive(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, and Object::ToCreature().

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5582{
5583 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5584 for (; range.first != range.second; ++range.first)
5585 {
5586 Aura* aura = range.first->second;
5587 if (!caster || aura->GetCasterGUID() == caster)
5588 {
5589 if (aura->GetDuration() < delaytime)
5590 aura->SetDuration(0);
5591 else
5592 aura->SetDuration(aura->GetDuration() - delaytime);
5593
5594 // update for out of range group members (on 1 slot use)
5596 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5597 }
5598 }
5599}
int32 GetDuration() const
Definition SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition SpellAuras.cpp:1210
void SetDuration(int32 duration, bool withMods=false)
Definition SpellAuras.cpp:810
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition Unit.h:662

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
16041{
16042 if (!m_charmInfo)
16043 return;
16044
16046 delete m_charmInfo;
16047 m_charmInfo = nullptr;
16048}
void RestoreState()
Definition CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4406{
4408}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition Unit.cpp:16994
uint32 GetNativeDisplayId() const
Definition Unit.h:1955

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18523{
18524 if (!IsCreature())
18525 return;
18526
18527 if (apply)
18531}
@ UNIT_STATE_POSSESSED
Definition UnitDefines.h:186
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:738

References HasUnitState(), Object::IsCreature(), RemoveUnitFlag(), SetUnitFlag(), UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_anub_arak::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13675{
13676 if (!IsMounted())
13677 return;
13678
13681
13682 if (Player* player = ToPlayer())
13683 {
13684 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13685 data << GetPackGUID();
13686 data << player->GetSession()->GetOrderCounter(); // movement counter
13687 data << player->GetCollisionHeight();
13688 player->SendDirectMessage(&data);
13689 player->GetSession()->IncrementOrderCounter();
13690 }
13691
13692 WorldPacket data(SMSG_DISMOUNT, 8);
13693 data << GetPackGUID();
13694 SendMessageToSet(&data, true);
13695
13696 // dismount as a vehicle
13697 if (IsPlayer() && GetVehicleKit())
13698 {
13699 // Send other players that we are no longer a vehicle
13700 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13701 data << GetPackGUID();
13702 data << uint32(0);
13703 ToPlayer()->SendMessageToSet(&data, true);
13704 // Remove vehicle from player
13706 }
13707
13709
13710 // only resummon old pet if the player is already added to a map
13711 // this prevents adding a pet to a not created map which would otherwise cause a crash
13712 // (it could probably happen when logging in after a previous crash)
13713 if (Player* player = ToPlayer())
13714 {
13715 sScriptMgr->AnticheatSetUnderACKmount(player);
13716
13717 if (Pet* pPet = player->GetPet())
13718 {
13719 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13720 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13721 }
13722 else
13723 player->ResummonPetTemporaryUnSummonedIfAny();
13724
13725 // xinef: if we have charmed npc, remove stun also
13726 if (Unit* charm = player->GetCharm())
13727 if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
13728 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13729 }
13730}
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition SpellDefines.h:49
@ UNIT_FLAG_STUNNED
Definition UnitDefines.h:272
@ UNIT_FLAG_MOUNT
Definition UnitDefines.h:281
@ UNIT_FIELD_MOUNTDISPLAYID
Definition UpdateFields.h:126
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition Player.cpp:5739
void RemoveVehicleKit()
Definition Unit.cpp:18974
@ SMSG_PLAYER_VEHICLE_DATA
Definition Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition Opcodes.h:1332
@ SMSG_DISMOUNT
Definition Opcodes.h:970

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), and npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11477{
11478 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11479
11480 if (powerType != POWER_HAPPINESS && gainedPower)
11481 {
11482 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11483 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11484 }
11485
11486 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11487}
@ POWER_HAPPINESS
Definition SharedDefines.h:284
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition Unit.cpp:11465

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19618{
19620
19621 if (Player* player = ToPlayer())
19622 {
19623 sScriptMgr->AnticheatSetUnderACKmount(player);
19624 }
19625}
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition SpellDefines.h:146
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition VehicleDefines.h:52

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::boss_mimironAI::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20480{
20482 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20483 return;
20484
20485 Acore::AIRelocationNotifier notifier(*this);
20486 float radius = 60.0f;
20487 Cell::VisitObjects(this, notifier, radius);
20488}
@ NOTIFY_AI_RELOCATION
Definition Object.h:69
void RemoveFromNotify(uint16 f)
Definition Object.h:658
Definition GridNotifiers.h:91
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:165

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20379{
20381 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20382 return;
20383
20384 if (this->HasSharedVision())
20385 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20386 if (Player* player = (*itr))
20387 {
20388 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20389 continue;
20390 WorldObject* viewPoint = player;
20391 if (player->m_seer && player->m_seer->IsInWorld())
20392 viewPoint = player->m_seer;
20393 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20394 continue;
20395
20396 if (Unit* active = viewPoint->ToUnit())
20397 {
20398 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20399 // active = player;
20400
20401 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20402 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20403 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20404 float distsq = dx * dx + dy * dy + dz * dz;
20405 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20406 if (distsq < mindistsq)
20407 continue;
20408
20409 // this will be relocated below sharedvision!
20410 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20411 }
20412
20413 Acore::PlayerRelocationNotifier notifier(*player);
20414 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20416 notifier.SendToSelf();
20417 }
20418
20419 if (Player* player = this->ToPlayer())
20420 {
20421 WorldObject* viewPoint = player;
20422 if (player->m_seer && player->m_seer->IsInWorld())
20423 viewPoint = player->m_seer;
20424
20425 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20426 return;
20427
20428 if (Unit* active = viewPoint->ToUnit())
20429 {
20430 if (active->IsVehicle())
20431 active = player;
20432
20433 if (!player->GetFarSightDistance())
20434 {
20435 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20436 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20437 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20438 float distsq = dx * dx + dy * dy + dz * dz;
20439
20440 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20441 if (distsq < mindistsq)
20442 return;
20443
20444 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20445 }
20446 }
20447
20449
20450 Acore::PlayerRelocationNotifier notifier(*player);
20451 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20453 notifier.SendToSelf();
20454
20456 }
20457 else if (Creature* unit = this->ToCreature())
20458 {
20459 if (!unit->IsPositionValid())
20460 return;
20461
20462 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20463 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20464 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20465 float distsq = dx * dx + dy * dy + dz * dz;
20466 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20467 if (distsq < mindistsq)
20468 return;
20469
20470 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20471
20472 Acore::CreatureRelocationNotifier relocate(*unit);
20473 Cell::VisitObjects(unit, relocate, unit->GetVisibilityRange());
20474
20476 }
20477}
#define MAX_VISIBILITY_DISTANCE
Definition ObjectDefines.h:30
#define VISIBILITY_DISTANCE_GIGANTIC
Definition ObjectDefines.h:34
@ NOTIFY_VISIBILITY_CHANGED
Definition Object.h:70
static float GetReqMoveDistSq(uint32 map_type)
Definition DynamicVisibility.h:53
void LoadGridsInRange(Position const &center, float radius)
Definition Map.cpp:226
Unit * ToUnit()
Definition Object.h:209
SharedVisionList const & GetSharedVisionList()
Definition Unit.h:1856
bool HasSharedVision() const
Definition Unit.h:1859
uint32 GetMapId() const
Definition Position.h:281
Definition Object.h:471
void AddToNotify(uint16 f)
Definition Object.cpp:2964
Definition GridNotifiers.h:83
Definition GridNotifiers.h:74
static void VisitFarVisibleObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:185
bool IsPositionValid() const
Definition Position.cpp:183

References WorldObject::AddToNotify(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), Map::LoadGridsInRange(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_DISTANCE_GIGANTIC, Cell::VisitFarVisibleObjects(), and Cell::VisitObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19714{
19716 if (!m_vehicle)
19717 return;
19718
19720 if (Player* player = ToPlayer())
19721 {
19722 player->SetCanTeleport(true);
19723 }
19727 /*_ExitVehicle(exitPosition);*/
19734
19735 if (Player* player = ToPlayer())
19736 {
19737 sScriptMgr->AnticheatSetUnderACKmount(player);
19738 }
19739}
Unit * GetVehicleBase() const
Definition Unit.cpp:18989

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), MotionTransport::DelayedTeleportTransport(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::HandleScript(), boss_kologarn_arms::boss_kologarn_armsAI::JustDied(), spell_dragonblight_devour_ghoul_periodic::OnRemove(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4135{
4136 Spell* spell = m_currentSpells[spellType];
4137 if (!spell)
4138 return;
4139
4140 if (spellType == CURRENT_CHANNELED_SPELL)
4141 spell->SendChannelUpdate(0);
4142
4143 spell->finish(ok);
4144}
void SendChannelUpdate(uint32 time)
Definition Spell.cpp:5141

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10830{
10831 if (!GetCharmerOrOwnerGUID())
10832 return const_cast<Unit*>(this)->ToPlayer();
10833
10834 if (Unit* owner = GetCharmerOrOwner())
10836
10837 return nullptr;
10838}
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1280

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
683{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), spell_kologarn_focused_eyebeam::FilterTargetsInitial(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), WorldState::HandleActiveZone(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_fatal_strike::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_random_aggro::HandleOnHit(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_grip::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::HandleSendEvent(), spell_black_knight_ghoul_claw::HandleSpellHit(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_claw_swipe_check::OnApply(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::OnPeriodic(), spell_grip::OnRemove(), spell_claw_swipe_check::OnRemove(), npc_dark_fiend::Reset(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
11056{
11057 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
11058 {
11059 Unit* unit = *itr;
11060 ++itr;
11061 if (unit->GetEntry() == entry && unit->IsCreature()
11062 && unit->ToCreature()->IsSummon()) // minion, actually
11063 Minions.push_back(unit->ToCreature());
11064 }
11065}
bool IsSummon() const
Definition Unit.h:784

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, and Object::ToCreature().

Referenced by spell_item_gift_of_the_harvester::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17463{
17464 if (!normalized || !IsPlayer())
17465 return float(GetAttackTime(attType)) / 1000.0f;
17466
17467 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17468 if (!Weapon)
17469 return 2.4f; // fist attack
17470
17471 switch (Weapon->GetTemplate()->InventoryType)
17472 {
17473 case INVTYPE_2HWEAPON:
17474 return 3.3f;
17475 case INVTYPE_RANGED:
17477 case INVTYPE_THROWN:
17478 return 2.8f;
17479 case INVTYPE_WEAPON:
17482 default:
17483 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17484 }
17485}
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition ItemTemplate.h:359
@ INVTYPE_RANGED
Definition ItemTemplate.h:271
@ INVTYPE_THROWN
Definition ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition ItemTemplate.h:273
Weapon
Definition boss_arlokk.cpp:67
Definition Item.h:220
ItemTemplate const * GetTemplate() const
Definition Item.cpp:544
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition PlayerStorage.cpp:490
uint32 SubClass
Definition ItemTemplate.h:622

References GetAttackTime(), Item::GetTemplate(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, Object::IsPlayer(), ITEM_SUBCLASS_WEAPON_DAGGER, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1369{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
755{
756 if (GetVictim() != nullptr)
757 return GetVictim();
758
759 if (!IsEngaged())
760 return nullptr;
761
762 if (!m_attackers.empty())
763 return *(m_attackers.begin());
764
765 return nullptr;
766}
bool IsEngaged() const
Definition Unit.h:921

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5701{
5702 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5703 return aurApp ? aurApp->GetBase() : nullptr;
5704}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5681

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::boss_freyaAI::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), boss_high_nethermancer_zerevor::JustEngagedWith(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::SetData(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::SpellHitTarget(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::SpellHitTarget(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5682{
5683 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5684 for (; range.first != range.second; ++range.first)
5685 {
5686 AuraApplication* app = range.first->second;
5687 Aura const* aura = app->GetBase();
5688
5689 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5690 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5691 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5692 && (!except || except != app))
5693 {
5694 return app;
5695 }
5696 }
5697 return nullptr;
5698}
uint8 GetEffectMask() const
Definition SpellAuras.h:177
ObjectGuid GetCastItemGUID() const
Definition SpellAuras.h:103
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition Unit.h:665

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5707{
5708 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5709 while (rankSpell)
5710 {
5711 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5712 return aurApp;
5713 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5714 }
5715 return nullptr;
5716}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5802{
5803 uint32 count = 0;
5804 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5805
5806 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5807 {
5808 if (itr->second->GetBase()->GetStackAmount() == 0)
5809 ++count;
5810 else
5811 count += (uint32)itr->second->GetBase()->GetStackAmount();
5812 }
5813
5814 return count;
5815}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5654{
5655 AuraEffectList const& auras = GetAuraEffectsByType(type);
5656 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5657 {
5658 SpellInfo const* spell = (*i)->GetSpellInfo();
5659 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5660 {
5661 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5662 continue;
5663 return (*i);
5664 }
5665 }
5666 return nullptr;
5667}
flag96 SpellFamilyFlags
Definition SpellInfo.h:388
uint32 SpellFamilyName
Definition SpellInfo.h:387
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition Util.h:459

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5640{
5641 AuraEffectList const& auras = GetAuraEffectsByType(type);
5642 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5643 {
5644 if (effIndex != (*itr)->GetEffIndex())
5645 continue;
5646 SpellInfo const* spell = (*itr)->GetSpellInfo();
5647 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5648 return *itr;
5649 }
5650 return nullptr;
5651}
uint32 SpellIconID
Definition SpellInfo.h:380

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5614{
5615 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5616 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5617 {
5618 if (itr->second->HasEffect(effIndex)
5619 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5620 {
5621 return itr->second->GetBase()->GetEffect(effIndex);
5622 }
5623 }
5624 return nullptr;
5625}

References AuraEffect::GetBase(), Aura::GetEffect(), and m_appliedAuras.

Referenced by CalculateSpellAmount(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5670{
5672 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5673 {
5674 if ((*itr)->GetId() == spellid)
5675 return *itr;
5676 }
5677
5678 return nullptr;
5679}
@ SPELL_AURA_DUMMY
Definition SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5628{
5629 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5630 while (rankSpell)
5631 {
5632 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5633 return aurEff;
5634 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5635 }
5636 return nullptr;
5637}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5613

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), GetDiseasesByCaster(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1413{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Spell::_cast(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Spell::CanAutoCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealDamageShieldDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), RedirectSpellEvent::Execute(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetHighestExclusiveSameEffectSpellGroupValue(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_warr_heroic_strike::HandleOnHit(), spell_illidari_council_judgement::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsHighestExclusiveAuraEffect(), IsImmunedToSpellEffect(), IsScriptOverriden(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Player::RegenerateAll(), Creature::Respawn(), RestoreDisplayId(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5719{
5720 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5721 return aurApp ? aurApp->GetBase() : nullptr;
5722}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5706

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods(), and spell_dk_pestilence::HandleScriptEffect().

◆ GetBoundaryRadius()

float Unit::GetBoundaryRadius ( ) const
inline

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17323{
17324 // Not apply this to creature casted spells with casttime == 0
17325 if (CastingTime == 0 && IsCreature() && !IsPet())
17326 return 3500;
17327
17328 if (CastingTime > 7000) CastingTime = 7000;
17329 if (CastingTime < 1500) CastingTime = 1500;
17330
17331 if (damagetype == DOT && !spellProto->IsChanneled())
17332 CastingTime = 3500;
17333
17334 int32 overTime = 0;
17335 uint8 effects = 0;
17336 bool DirectDamage = false;
17337 bool AreaEffect = false;
17338
17339 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17340 {
17341 switch (spellProto->Effects[i].Effect)
17342 {
17348 case SPELL_EFFECT_HEAL:
17349 DirectDamage = true;
17350 break;
17352 switch (spellProto->Effects[i].ApplyAuraName)
17353 {
17357 if (spellProto->GetDuration())
17358 overTime = spellProto->GetDuration();
17359 break;
17360 default:
17361 // -5% per additional effect
17362 ++effects;
17363 break;
17364 }
17365 default:
17366 break;
17367 }
17368
17369 if (spellProto->Effects[i].IsTargetingArea())
17370 AreaEffect = true;
17371 }
17372
17373 // Combined Spells with Both Over Time and Direct Damage
17374 if (overTime > 0 && DirectDamage)
17375 {
17376 // mainly for DoTs which are 3500 here otherwise
17377 uint32 OriginalCastTime = spellProto->CalcCastTime();
17378 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17379 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17380 // Portion to Over Time
17381 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17382
17383 if (damagetype == DOT)
17384 CastingTime = uint32(CastingTime * PtOT);
17385 else if (PtOT < 1.0f)
17386 CastingTime = uint32(CastingTime * (1 - PtOT));
17387 else
17388 CastingTime = 0;
17389 }
17390
17391 // Area Effect Spells receive only half of bonus
17392 if (AreaEffect)
17393 CastingTime /= 2;
17394
17395 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17396 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17397 {
17398 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17399 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17400 {
17401 CastingTime /= 2;
17402 break;
17403 }
17404 }
17405
17406 // -5% of total per any additional effect
17407 for (uint8 i = 0; i < effects; ++i)
17408 CastingTime *= 0.95f;
17409
17410 return CastingTime;
17411}
@ SPELL_EFFECT_POWER_BURN
Definition SharedDefines.h:851
@ SPELL_EFFECT_HEALTH_LEECH
Definition SharedDefines.h:798
@ SPELL_EFFECT_HEAL
Definition SharedDefines.h:799
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition SharedDefines.h:796
@ SPELL_EFFECT_POWER_DRAIN
Definition SharedDefines.h:797
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition SharedDefines.h:791
@ SPELL_EFFECT_APPLY_AURA
Definition SharedDefines.h:795
@ SPELL_AURA_PERIODIC_DAMAGE
Definition SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition SpellAuraDefines.h:116

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), SpellInfo::IsChanneled(), Object::IsCreature(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, and SPELL_EFFECT_SCHOOL_DAMAGE.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10876{
10877 if (ObjectGuid charm_guid = GetCharmGUID())
10878 {
10879 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10880 return pet;
10881
10882 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10884 }
10885
10886 return nullptr;
10887}
@ UNIT_FIELD_CHARM
Definition UpdateFields.h:86
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:712
ObjectGuid GetCharmGUID() const
Definition Unit.h:711
Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:199

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1273 {
1274 if (Unit* u = GetCharmerOrOwner())
1275 return u;
1276
1277 return (Unit*)this;
1278 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10821{
10823 if (guid.IsPlayer())
10824 return ObjectAccessor::GetPlayer(*this, guid);
10825
10826 return const_cast<Unit*>(this)->ToPlayer();
10827}
Player * GetPlayer(Map const *, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:220

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), _IsValidAttackTarget(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
833{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:312

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), Player::CheckSkillLearnedBySpell(), spell_class_call_handler::FilterTargets(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetClientControlling()

Player const * Unit::GetClientControlling ( ) const
21467{
21468 // Serverside reverse "mover" deduction logic at controlled unit
21469
21470 // Applies only to player controlled units
21472 {
21473 // Charm always removes control from original client...
21474 if (GetCharmerGUID())
21475 {
21476 // ... but if it is a possessing charm, some other client may have control
21478 {
21479 Unit const* charmer = GetCharmer();
21480 if (charmer && charmer->IsPlayer())
21481 return static_cast<Player const*>(charmer);
21482 }
21483 }
21484 else if (IsPlayer())
21485 {
21486 // Check if anything prevents original client from controlling
21487 if (IsClientControlled(static_cast<Player const*>(this)))
21488 return static_cast<Player const*>(this);
21489 }
21490 }
21491 return nullptr;
21492}
bool IsClientControlled(Player const *exactClient=nullptr) const
Definition Unit.cpp:21439

References GetCharmer(), GetCharmerGUID(), Object::HasFlag(), IsClientControlled(), Object::IsPlayer(), UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_FLAG_POSSESSED.

Referenced by SendMoveRoot(), SetCanFly(), SetDisableGravity(), SetFeatherFall(), SetHover(), SetSpeed(), and SetWaterWalking().

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

21199{
21200 float scaleMod = GetObjectScale(); // 99% sure about this
21201 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
21202
21203 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21204 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21205 float collisionHeight = 0.0f;
21206
21207 if (IsMounted())
21208 {
21210 {
21211 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21212 {
21213 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
21214 }
21215 }
21216 }
21217 else
21218 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
21219
21220 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
21221}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COLLISION_HEIGHT
Definition ObjectDefines.h:49
float GetObjectScale() const
Definition Object.h:119
Definition DBCStructure.h:721
uint32 ModelId
Definition DBCStructure.h:723
float scale
Definition DBCStructure.h:726
Definition DBCStructure.h:775
float Scale
Definition DBCStructure.h:779
float CollisionHeight
Definition DBCStructure.h:790

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), GetRandomContactPoint(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), WorldSession::ProcessMovementInfo(), ProcessTerrainStatusUpdate(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

21193{
21194 return GetCollisionWidth() / 2;
21195}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition Unit.cpp:21155

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

21156{
21157 if (IsPlayer())
21158 return GetObjectSize();
21159
21160 float scaleMod = GetObjectScale(); // 99% sure about this
21161 float objectSize = GetObjectSize();
21162 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
21163
21165 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21166 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21167
21168 if (IsMounted())
21169 {
21171 {
21172 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21173 {
21174 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
21175 modelData = mountModelData;
21176 }
21177 }
21178 }
21179
21180 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
21181 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
21182 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
21183}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition ObjectDefines.h:44
float GetObjectSize() const
Definition Object.cpp:2782
float CollisionWidth
Definition DBCStructure.h:789

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetUInt32Value(), IsMounted(), Object::IsPlayer(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19440{
19441 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19442 return CalculatePct(damage, percent);
19443}
float GetCombatRatingReduction(CombatRating cr) const
Definition Unit.cpp:19427

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19428{
19429 if (Player const* player = ToPlayer())
19430 return player->GetRatingBonusValue(cr);
19431 // Player's pet get resilience from owner
19432 else if (IsPet() && GetOwner())
19433 if (Player* owner = GetOwner()->ToPlayer())
19434 return owner->GetRatingBonusValue(cr);
19435
19436 return 0.0f;
19437}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
934{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
1000{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
1001{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCompanionPet()

Creature * Unit::GetCompanionPet ( ) const
10871{
10873}
@ SUMMON_SLOT_MINIPET
Definition SharedDefines.h:3566
Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:210

References ObjectAccessor::GetCreature(), m_SummonSlot, and SUMMON_SLOT_MINIPET.

Referenced by HandleProcTriggerSpell().

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15882{
15883 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15884 switch (power)
15885 {
15886 case POWER_MANA:
15887 return GetCreateMana();
15888 case POWER_RAGE:
15889 return 1000;
15890 case POWER_FOCUS:
15891 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15892 case POWER_ENERGY:
15893 return 100;
15894 case POWER_HAPPINESS:
15895 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15896 case POWER_RUNIC_POWER:
15897 return 1000;
15898 case POWER_RUNE:
15899 return 0;
15900 case POWER_HEALTH:
15901 return 0;
15902 default:
15903 break;
15904 }
15905
15906 return 0;
15907}
@ POWER_HEALTH
Definition SharedDefines.h:289
@ POWER_RUNIC_POWER
Definition SharedDefines.h:286
@ POWER_ENERGY
Definition SharedDefines.h:283
@ POWER_RUNE
Definition SharedDefines.h:285
@ POWER_FOCUS
Definition SharedDefines.h:282
uint32 GetCreateMana() const
Definition Unit.h:1133

References GetCreateMana(), HUNTER_PET, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, and POWER_RUNIC_POWER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15293{
15294 if (IsPlayer())
15295 {
15297 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15298 if (ssEntry && ssEntry->creatureType > 0)
15299 return ssEntry->creatureType;
15300 else
15302 }
15303 else
15304 return ToCreature()->GetCreatureTemplate()->type;
15305}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
@ CREATURE_TYPE_HUMANOID
Definition SharedDefines.h:2645
ShapeshiftForm
Definition UnitDefines.h:68
ShapeshiftForm GetShapeshiftForm() const
Definition Unit.h:1936
uint32 type
Definition CreatureData.h:222
Definition DBCStructure.h:1815
int32 creatureType
Definition DBCStructure.h:1821

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
819 {
820 uint32 creatureType = GetCreatureType();
821 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
822 }
uint32 GetCreatureType() const
Definition Unit.cpp:15292

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
1562{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4209{
4210 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4211 return spell->GetCastTime();
4212 return 0;
4213}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:4200

References FindCurrentSpellBySpellId(), and Spell::GetCastTime().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from Object.

21429{
21430 std::stringstream sstr;
21431 sstr << WorldObject::GetDebugInfo() << "\n"
21432 << std::boolalpha
21433 << "AliveState: " << IsAlive()
21434 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21435 << " Class: " << std::to_string(getClass());
21436 return sstr.str();
21437}
std::string GetDebugInfo() const override
Definition Object.cpp:2481

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16862{
16863 return IDLE_MOTION_TYPE;
16864}
@ IDLE_MOTION_TYPE
Definition MotionMaster.h:39

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3655{
3656 if (IsPlayer())
3657 {
3658 // in PvP use full skill instead current skill value
3659 uint32 value = (target && target->IsPlayer())
3662 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3663 return value;
3664 }
3665 else
3666 return GetUnitMeleeSkill(target);
3667}
@ SKILL_DEFENSE
Definition SharedDefines.h:3131
@ CR_DEFENSE_SKILL
Definition Unit.h:225
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5520
uint16 GetMaxSkillValue(uint32 skill) const
Definition Player.cpp:5537

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), GetUnitMeleeSkill(), Object::IsPlayer(), SKILL_DEFENSE, and Object::ToPlayer().

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
15113{
15114 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15115 {
15116 if (i->DRGroup != group)
15117 continue;
15118
15119 if (!i->hitCount)
15120 return DIMINISHING_LEVEL_1;
15121
15122 if (!i->hitTime)
15123 return DIMINISHING_LEVEL_1;
15124
15125 // If last spell was casted more than 15 seconds ago - reset the count.
15126 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15127 {
15128 i->hitCount = DIMINISHING_LEVEL_1;
15129 return DIMINISHING_LEVEL_1;
15130 }
15131 // or else increase the count.
15132 else
15133 return DiminishingLevels(i->hitCount);
15134 }
15135 return DIMINISHING_LEVEL_1;
15136}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5964{
5965 static const AuraType diseaseAuraTypes[] =
5966 {
5967 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5968 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5970 };
5971
5972 ObjectGuid drwGUID;
5973
5974 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5975 drwGUID = playerCaster->getRuneWeaponGUID();
5976
5977 uint32 diseases = 0;
5978 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5979 {
5980 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5981 {
5982 // Get auras with disease dispel type by caster
5983 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5984 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5985 {
5986 ++diseases;
5987
5988 if (mode == 1)
5989 {
5990 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5991 i = m_modAuras[diseaseAuraTypes[index]].begin();
5992 continue;
5993 }
5994 // used for glyph of scourge strike
5995 else if (mode == 2)
5996 {
5997 Aura* aura = (*i)->GetBase();
5998 uint32 countMin = aura->GetMaxDuration();
5999 uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000;
6000
6001 if (AuraEffect const* epidemic = (*i)->GetCaster()->GetAuraEffectOfRankedSpell(49036, EFFECT_0))
6002 countMax += epidemic->GetAmount();
6003
6004 if (countMin < countMax)
6005 {
6006 aura->SetDuration(uint32(aura->GetDuration() + 3000));
6007 aura->SetMaxDuration(countMin + 3000);
6008 }
6009 }
6010 }
6011 ++i;
6012 }
6013 }
6014 return diseases;
6015}
@ EFFECT_0
Definition SharedDefines.h:31
@ DISPEL_DISEASE
Definition SharedDefines.h:1386
AuraType
Definition SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition SpellAuraDefines.h:63
int32 GetMaxDuration() const
Definition SpellAuras.h:129
void SetMaxDuration(int32 duration)
Definition SpellAuras.h:130
int32 GetMaxDuration() const
Definition SpellInfo.cpp:2239
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5627

References DISPEL_DISEASE, EFFECT_0, GetAuraEffectOfRankedSpell(), AuraEffect::GetCaster(), Aura::GetDuration(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::GetSpellInfo(), m_modAuras, RemoveAura(), Aura::SetDuration(), Aura::SetMaxDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5725{
5726 // we should not be able to dispel diseases if the target is affected by unholy blight
5727 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5728 dispelMask &= ~(1 << DISPEL_DISEASE);
5729
5730 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5731 bool positive = rank >= REP_FRIENDLY;
5732
5733 // Neutral unit not at war with caster should be treated as a friendly unit
5734 if (rank == REP_NEUTRAL)
5735 {
5736 if (Player* casterPlayer = caster->GetAffectingPlayer())
5737 {
5738 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5739 {
5740 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5741 {
5742 if (factionEntry->CanBeSetAtWar())
5743 {
5744 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5745 }
5746 }
5747 }
5748 }
5749 }
5750
5751 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5752 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5753 {
5754 Aura* aura = itr->second->GetBase();
5755
5756 // don't try to remove passive auras
5757 if (aura->IsPassive())
5758 continue;
5759
5760 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5761 {
5762 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5763 {
5764 // do not remove positive auras if friendly target
5765 // negative auras if non-friendly target
5766 if (itr->second->IsPositive() == positive)
5767 continue;
5768 }
5769
5770 // Banish should only be dispelled by Mass Dispel
5771 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5772 {
5773 continue;
5774 }
5775
5776 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5777 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5778 // Polymorph instead of 1 / (5 + 1) -> 16%.
5779 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5780 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5781 if (charges > 0)
5782 dispelList.push_back(std::make_pair(aura, charges));
5783 }
5784 }
5785}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition SharedDefines.h:662
@ MECHANIC_BANISH
Definition SharedDefines.h:1354
@ SPELL_ATTR0_NO_IMMUNITIES
Definition SharedDefines.h:422
@ REP_FRIENDLY
Definition SharedDefines.h:184
@ DISPEL_MAGIC
Definition SharedDefines.h:1384
uint8 GetStackAmount() const
Definition SpellAuras.h:148
uint8 GetCharges() const
Definition SpellAuras.h:141
bool IsPassive() const
Definition SpellAuras.cpp:1034
uint32 Mechanic
Definition SpellInfo.h:323
uint32 Dispel
Definition SpellInfo.h:322
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5840
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition Unit.h:677
VisibleAuraMap const * GetVisibleAuras()
Definition Unit.h:1524

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::CheckCast(), and Spell::EffectDispel().

◆ GetDisplayId()

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition Unit.cpp:21117
uint32 GetDisplayId() const
Definition Unit.h:1953

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
21118{
21119 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
21120 {
21121 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
21122 {
21123 return DisplayRace(displayExtra->DisplayRaceID);
21124 }
21125 }
21126 return DisplayRace::None;
21127}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition SharedDefines.h:111
Definition DBCStructure.h:739

References None, sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
6018{
6019 static const AuraType diseaseAuraTypes[] =
6020 {
6024 };
6025
6026 uint32 dots = 0;
6027 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
6028 {
6029 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
6030 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
6031 {
6032 // Get auras by caster
6033 if ((*i)->GetCasterGUID() == casterGUID)
6034 ++dots;
6035 }
6036 }
6037 return dots;
6038}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6356{
6357 if (m_dynObj.empty())
6358 return nullptr;
6359 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6360 {
6361 DynamicObject* dynObj = *i;
6362 if (dynObj->GetSpellId() == spellId)
6363 return dynObj;
6364 }
6365 return nullptr;
6366}
Definition DynamicObject.h:35
uint32 GetSpellId() const
Definition DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), WorldSession::HandleFarSightOpcode(), and boss_akilzon::JustEngagedWith().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2150{
2151 float victimResistance = float(victim->GetResistance(schoolMask));
2152 if (owner)
2153 {
2154 // Xinef: pets inherit 100% of masters penetration
2155 // Xinef: excluding traps
2156 Player const* player = owner->GetSpellModOwner();
2157 if (player && owner->GetEntry() != WORLD_TRIGGER)
2158 {
2159 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2160 victimResistance -= float(player->GetSpellPenetrationItemMod());
2161 }
2162 else
2163 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2164 }
2165
2166 victimResistance = std::max(victimResistance, 0.0f);
2167 if (owner)
2168 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2169
2170 static uint32 const BOSS_LEVEL = 83;
2171 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2172 uint32 level = victim->GetLevel();
2173 float resistanceConstant = 0.0f;
2174
2175 if (level == BOSS_LEVEL)
2176 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2177 else
2178 resistanceConstant = level * 5.0f;
2179
2180 return victimResistance / (victimResistance + resistanceConstant);
2181}
int32 GetSpellPenetrationItemMod() const
Definition Player.h:1971

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::AttackStart(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::EnterEvadeMode(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::PassengerBoarded(), PatchValuesUpdate(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_chesspiece::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_overlord_drakuru_betrayal::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10364{
10365 // always neutral when no template entry found
10366 if (!factionTemplateEntry)
10367 return REP_NEUTRAL;
10368
10369 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10370 if (!targetFactionTemplateEntry)
10371 return REP_NEUTRAL;
10372
10373 // xinef: check forced reputation for self also
10374 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10375 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10376 return *repRank;
10377
10378 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10379 {
10380 // check contested flags
10381 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10382 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10383 return REP_HOSTILE;
10384 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10385 return *repRank;
10386 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10387 {
10388 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10389 {
10390 if (factionEntry->CanHaveReputation())
10391 {
10392 // CvP case - check reputation, don't allow state higher than neutral when at war
10393 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10394 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10395 repRank = std::min(REP_NEUTRAL, repRank);
10396 return repRank;
10397 }
10398 }
10399 }
10400 }
10401
10402 // common faction based check
10403 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10404 return REP_HOSTILE;
10405 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10406 return REP_FRIENDLY;
10407 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10408 return REP_FRIENDLY;
10409 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10410 return REP_HOSTILE;
10411 // neutral by default
10412 return REP_NEUTRAL;
10413}
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition DBCEnums.h:332
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition UnitDefines.h:295
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition DBCStructure.h:951

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
10214{
10215 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10216 if (!entry)
10217 {
10218 static ObjectGuid guid; // prevent repeating spam same faction problem
10219
10220 if (GetGUID() != guid)
10221 {
10222 if (Player const* player = ToPlayer())
10223 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10224 else if (Creature const* creature = ToCreature())
10225 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10226 else
10227 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10228
10229 guid = GetGUID();
10230 }
10231 }
10232 return entry;
10233}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
TypeID GetTypeId() const
Definition Object.h:128
uint32 GetFaction() const
Definition Unit.h:841
std::string const & GetName() const
Definition Object.h:524

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), Player::CanUseBattlegroundObject(), npc_necrotic_shard::DamageTaken(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), npc_chesspiece::OnCharmed(), PatchValuesUpdate(), and RespondsToCallForHelp().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11284{
11285 // Sequence: charmed, pet, other guardians
11286 Unit* unit = GetCharm();
11287 if (!unit)
11288 if (ObjectGuid guid = GetMinionGUID())
11289 unit = ObjectAccessor::GetUnit(*this, guid);
11290
11291 return unit;
11292}
ObjectGuid GetMinionGUID() const
Definition Unit.h:707

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstCurrentCastingSpell()

Spell * Unit::GetFirstCurrentCastingSpell ( ) const
4192{
4193 for (uint32 i = 0; i < CURRENT_MAX_SPELL; i++)
4194 if (m_currentSpells[i] && m_currentSpells[i]->GetCastTimeRemaining() > 0)
4195 return m_currentSpells[i];
4196
4197 return nullptr;
4198}

References CURRENT_MAX_SPELL, and m_currentSpells.

Referenced by ChaseMovementGenerator< T >::DoUpdate().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10841{
10842 if (ObjectGuid pet_guid = GetMinionGUID())
10843 {
10844 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10845 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10846 return (Minion*)pet;
10847
10848 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10849 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10850 }
10851
10852 return nullptr;
10853}
void SetMinionGUID(ObjectGuid guid)
Definition Unit.h:708
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const &)
Definition ObjectAccessor.cpp:234

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFlatModifierValue()

float Unit::GetFlatModifierValue ( UnitMods  unitMod,
UnitModifierFlatType  modifierType 
) const

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6397{
6398 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6399 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6400 if (go->GetSpellId() == spellId)
6401 return go;
6402
6403 return nullptr;
6404}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10856{
10857 if (ObjectGuid pet_guid = GetPetGUID())
10858 {
10859 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10860 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10861 return (Guardian*)pet;
10862
10863 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10864 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10865 }
10866
10867 return nullptr;
10868}
#define LOG_FATAL(filterType__,...)
Definition Log.h:154
Definition TemporarySummon.h:96
void SetPetGUID(ObjectGuid guid)
Definition Unit.h:712
ObjectGuid GetPetGUID() const
Definition Unit.h:713

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), ScriptedAI::DamageTaken(), boss_eregos::boss_eregosAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), npc_dark_fiend::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_wild_wyrm::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), npc_akama_illidan::DamageTaken(), npc_maiev_illidan::DamageTaken(), boss_illidari_council::DamageTaken(), boss_illidari_council_memberAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), boss_alar::DamageTaken(), advisor_baseAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_nightbane::DamageTaken(), boss_thekal::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_anub_arak::DamageTaken(), boss_illidan_stormrage::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::boss_kologarnAI::DamageTaken(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), DealDamageShieldDamage(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), spell_illidari_council_empyreal_balance::HandleAfterCast(), spell_illidari_council_empyreal_equivalency::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), Aura::Update(), boss_headless_horseman::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14297{
14298 int32 gain = 0;
14299
14300 if (dVal == 0)
14301 return 0;
14302
14303 int32 curHealth = (int32)GetHealth();
14304
14305 int32 val = dVal + curHealth;
14306 if (val <= 0)
14307 {
14308 return -curHealth;
14309 }
14310
14311 int32 maxHealth = (int32)GetMaxHealth();
14312
14313 if (val < maxHealth)
14314 gain = dVal;
14315 else if (curHealth != maxHealth)
14316 gain = maxHealth - curHealth;
14317
14318 return gain;
14319}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ GetHighestExclusiveSameEffectSpellGroupValue()

int32 Unit::GetHighestExclusiveSameEffectSpellGroupValue ( AuraEffect const *  aurEff,
AuraType  auraType,
bool  checkMiscValue = false,
int32  miscValue = 0 
) const
4411{
4412 int32 val = 0;
4413 SpellSpellGroupMapBounds spellGroup = sSpellMgr->GetSpellSpellGroupMapBounds(aurEff->GetSpellInfo()->GetFirstRankSpell()->Id);
4414 for (SpellSpellGroupMap::const_iterator itr = spellGroup.first; itr != spellGroup.second ; ++itr)
4415 {
4416 if (sSpellMgr->GetSpellGroupStackRule(itr->second) == SPELL_GROUP_STACK_RULE_EXCLUSIVE_SAME_EFFECT)
4417 {
4418 AuraEffectList const& auraEffList = GetAuraEffectsByType(auraType);
4419 for (AuraEffectList::const_iterator auraItr = auraEffList.begin(); auraItr != auraEffList.end(); ++auraItr)
4420 {
4421 if (aurEff != (*auraItr) && (!checkMiscValue || (*auraItr)->GetMiscValue() == miscValue) &&
4422 sSpellMgr->IsSpellMemberOfSpellGroup((*auraItr)->GetSpellInfo()->Id, itr->second))
4423 {
4424 // absolute value only
4425 if (abs(val) < abs((*auraItr)->GetAmount()))
4426 val = (*auraItr)->GetAmount();
4427 }
4428 }
4429 }
4430 }
4431 return val;
4432}
std::pair< SpellSpellGroupMap::const_iterator, SpellSpellGroupMap::const_iterator > SpellSpellGroupMapBounds
Definition SpellMgr.h:356
@ SPELL_GROUP_STACK_RULE_EXCLUSIVE_SAME_EFFECT
Definition SpellMgr.h:367

References GetAuraEffectsByType(), SpellInfo::GetFirstRankSpell(), AuraEffect::GetSpellInfo(), SpellInfo::Id, SPELL_GROUP_STACK_RULE_EXCLUSIVE_SAME_EFFECT, and sSpellMgr.

Referenced by AuraEffect::HandleAuraModStat(), AuraEffect::HandleModCastingSpeed(), AuraEffect::HandleModCombatSpeedPct(), and AuraEffect::HandleModMeleeSpeedPct().

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
1588{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
957{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
995{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), AuraEffect::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), ServerMailCondition::CheckCondition(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), CreateTamedPetFrom(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Pet::GetNativeObjectScale(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Player::GetsRecruitAFriendBonus(), Player::GetTrainerSpellState(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleAuctionListItems(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Creature::isCanTrainingAndResetTalentsOf(), Player::isHonorOrXPTarget(), Player::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
11228{
11229 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11230 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11231 return victim;
11232
11234 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11235 {
11236 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11237 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11238 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11239 && _IsValidAttackTarget(magnet, spellInfo)
11240 /*&& IsWithinLOSInMap(magnet)*/)
11241 {
11242 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
11243 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11244
11245 if (magnet->IsTotem())
11246 {
11247 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11248 if (spellInfo->Speed > 0.0f)
11249 {
11250 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11251 if (dist < 5.0f)
11252 dist = 5.0f;
11253 queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f));
11254 }
11255
11256 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11257 }
11258
11259 return magnet;
11260 }
11261 }
11262 return victim;
11263}
@ SPELL_ATTR1_NO_REDIRECTION
Definition SharedDefines.h:433
@ SPELL_ATTR0_IS_ABILITY
Definition SharedDefines.h:397
@ SPELL_AURA_SPELL_MAGNET
Definition SpellAuraDefines.h:159
Definition TotemAI.h:47
Definition Unit.h:2303
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition Unit.cpp:14035
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1271

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), Battleground::AddPlayer(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), npc_dark_fiend::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), spell_illidari_council_empyreal_balance::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), spell_pal_lay_on_hands::HandleMaxHealthHeal(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), npc_necrotic_shard::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier() [1/2]

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const

◆ GetMaxNegativeAuraModifier() [2/2]

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auraType,
std::function< bool(AuraEffect const *)> const &  predicate 
) const
6111{
6112 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auraType);
6113 if (mTotalAuraList.empty())
6114 return 0;
6115
6116 int32 modifier = 0;
6117 for (AuraEffect const* aurEff : mTotalAuraList)
6118 {
6119 if (predicate(aurEff))
6120 modifier = std::min(modifier, aurEff->GetAmount());
6121 }
6122
6123 return modifier;
6124}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6257{
6258 return GetMaxNegativeAuraModifier(auraType, [affectedSpell](AuraEffect const* aurEff) -> bool
6259 {
6260 if (aurEff->IsAffectedOnSpell(affectedSpell))
6261 return true;
6262 return false;
6263 });
6264}

References GetMaxNegativeAuraModifier(), and AuraEffect::IsAffectedOnSpell().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6177{
6178 return GetMaxNegativeAuraModifier(auraType, [miscMask](AuraEffect const* aurEff) -> bool
6179 {
6180 if ((aurEff->GetMiscValue() & miscMask) != 0)
6181 return true;
6182 return false;
6183 });
6184}

References GetMaxNegativeAuraModifier(), and AuraEffect::GetMiscValue().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6217{
6218 return GetMaxNegativeAuraModifier(auraType, [miscValue](AuraEffect const* aurEff) -> bool
6219 {
6220 if (aurEff->GetMiscValue() == miscValue)
6221 return true;
6222 return false;
6223 });
6224}

References GetMaxNegativeAuraModifier(), and AuraEffect::GetMiscValue().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier() [1/2]

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auratype) const

◆ GetMaxPositiveAuraModifier() [2/2]

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auraType,
std::function< bool(AuraEffect const *)> const &  predicate 
) const
6095{
6096 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auraType);
6097 if (mTotalAuraList.empty())
6098 return 0;
6099
6100 int32 modifier = 0;
6101 for (AuraEffect const* aurEff : mTotalAuraList)
6102 {
6103 if (predicate(aurEff))
6104 modifier = std::max(modifier, aurEff->GetAmount());
6105 }
6106
6107 return modifier;
6108}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6247{
6248 return GetMaxPositiveAuraModifier(auraType, [affectedSpell](AuraEffect const* aurEff) -> bool
6249 {
6250 if (aurEff->IsAffectedOnSpell(affectedSpell))
6251 return true;
6252 return false;
6253 });
6254}

References GetMaxPositiveAuraModifier(), and AuraEffect::IsAffectedOnSpell().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
6167{
6168 return GetMaxPositiveAuraModifier(auraType, [miscMask, except](AuraEffect const* aurEff) -> bool
6169 {
6170 if (except != aurEff && (aurEff->GetMiscValue() & miscMask) != 0)
6171 return true;
6172 return false;
6173 });
6174}

References GetMaxPositiveAuraModifier(), and AuraEffect::GetMiscValue().

Referenced by AuraEffect::HandleAuraModResistanceExclusive(), SpellTakenCritChance(), and UpdateResistanceBuffModsMod().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6207{
6208 return GetMaxPositiveAuraModifier(auraType, [miscValue](AuraEffect const* aurEff) -> bool
6209 {
6210 if (aurEff->GetMiscValue() == miscValue)
6211 return true;
6212 return false;
6213 });
6214}

References GetMaxPositiveAuraModifier(), and AuraEffect::GetMiscValue().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
1121{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), boss_selin_fireheart::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
1189{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition Unit.h:1089

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3172{
3173 if (!spell)
3174 return 0;
3175 int32 resist_mech = 0;
3176 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3177 {
3178 if (!spell->Effects[eff].IsEffect())
3179 break;
3180 int32 effect_mech = spell->GetEffectMechanic(eff);
3181 if (effect_mech)
3182 {
3184 if (resist_mech < temp)
3185 resist_mech = temp;
3186 }
3187 }
3188 return resist_mech;
3189}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6186

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2708{
2709 if (!attacker)
2710 {
2711 return false;
2712 }
2713
2714 AttackerSet attackers = getAttackers();
2715
2716 if (attackers.size() <= 1) // if the attackers are not more than one
2717 {
2718 return false;
2719 }
2720
2721 float meleeReach = GetExactDist2d(attacker);
2722 if (meleeReach <= 0)
2723 {
2724 return false;
2725 }
2726
2727 float minAngle = 0;
2728 Unit *refUnit = nullptr;
2729 uint32 validAttackers = 0;
2730
2731 double attackerSize = attacker->GetCollisionRadius();
2732
2733 for (auto const& otherAttacker: attackers)
2734 {
2735 // if the otherAttacker is not valid, skip
2736 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2737 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2738 {
2739 continue;
2740 }
2741
2742 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2743 if (minAngle == 0 || curretAngle < minAngle)
2744 {
2745 minAngle = curretAngle;
2746 refUnit = otherAttacker;
2747 }
2748
2749 validAttackers++;
2750 }
2751
2752 if (!validAttackers || !refUnit)
2753 {
2754 return false;
2755 }
2756
2757 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2758 float requiredAngle = atan(contactDist / meleeReach);
2759 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2760
2761 // in instance: the more attacker there are, the higher will be the tollerance
2762 // outside: creatures should not intersecate
2763 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2764
2765 if (attackersAngle > angleTollerance)
2766 {
2767 return false;
2768 }
2769
2770 double angle = atan(contactDist / meleeReach);
2771
2772 float angularRadius = frand(0.1f, 0.3f) + angle;
2773 int8 direction = (urand(0, 1) ? -1 : 1);
2774 float currentAngle = GetAngle(refUnit);
2775 float absAngle = currentAngle + angularRadius * direction;
2776
2777 float x, y, z;
2778 float distance = meleeReach - GetObjectSize();
2779 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2780
2781 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2782 {
2783 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2784
2785 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2786 {
2787 return false;
2788 }
2789 }
2790
2791 pos.Relocate(x, y, z);
2792
2793 return true;
2794}
std::int8_t int8
Definition Define.h:105
float frand(float min, float max)
Definition Random.cpp:57
bool IsDungeon() const
Definition Map.h:295
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition Unit.cpp:21192
std::unordered_set< Unit * > AttackerSet
Definition Unit.h:657
AttackerSet const & getAttackers() const
Definition Unit.h:890
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition Object.cpp:2637
float GetExactDist2d(const float x, const float y) const
Definition Position.h:170

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
1259{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition Unit.cpp:19439

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
11266{
11268 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11269 {
11270 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11271 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11272 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11273 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11274 if (roll_chance_i((*i)->GetAmount()))
11275 {
11276 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11277 return magnet;
11278 }
11279 }
11280 return victim;
11281}
bool roll_chance_i(int chance)
Definition Random.h:63
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition SpellAuraDefines.h:174

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
684{
685 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
686 return std::max(range, NOMINAL_MELEE_RANGE);
687}
#define NOMINAL_MELEE_RANGE
Definition ObjectDefines.h:47
float GetCombatReach() const override
Definition Unit.h:867

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by SmartAI::DistanceYourself(), GetRandomContactPoint(), IsWithinMeleeRange(), CreatureAI::MoveBackwardsChecks(), and SmartScript::ProcessAction().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
868{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition ObjectDefines.h:46

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
)
19446{
19447 // Hardcoded cases
19448 switch (spellId)
19449 {
19450 case 7090: // Bear form
19451 return 29414;
19452 case 35200: // Roc form
19453 return 4877;
19454 default:
19455 break;
19456 }
19457
19458 if (IsPlayer())
19459 {
19460 if (uint32 ModelId = sObjectMgr->GetModelForShapeshift(form, ToPlayer()))
19461 return ModelId;
19462 }
19463
19464 uint32 modelid = 0;
19465 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19466 if (formEntry && formEntry->modelID_A)
19467 {
19468 // Take the alliance modelid as default
19469 if (!IsPlayer())
19470 return formEntry->modelID_A;
19471 else
19472 {
19474 modelid = formEntry->modelID_A;
19475 else
19476 modelid = formEntry->modelID_H;
19477
19478 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19479 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19480 modelid = formEntry->modelID_A;
19481 }
19482 }
19483
19484 return modelid;
19485}
@ TEAM_ALLIANCE
Definition SharedDefines.h:771
@ TEAM_HORDE
Definition SharedDefines.h:772
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:5900
uint8 getRace(bool original=false) const
Definition Unit.cpp:21098
uint32 modelID_H
Definition DBCStructure.h:1825
uint32 modelID_A
Definition DBCStructure.h:1824

References getRace(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, sObjectMgr, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, Player::TeamIdForRace(), and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
1738{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), Creature::CanCreatureAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_alar::ConstructWaypointsAndMove(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_wild_wyrm::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), SmartAI::DistanceYourself(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_harrison_jones::DoAction(), npc_amanishi_lookout::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_hadronox_crusherPackAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), npc_spark_of_ionar::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::EndBattle(), boss_jindo::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), AssistanceMovementGenerator::Finalize(), npc_singularity::FindAndFollowTarget(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::HandleEvent(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), spell_chapter2_persuasive_strike::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_felmyst::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_demonic_vapor::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), Creature::IsUpdateNeeded(), JumpTo(), JumpTo(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_cyclone::JustEngagedWith(), npc_sunblade_scout::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_amanishi_scout::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_felmyst::JustEngagedWith(), boss_janalai::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_janalai::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_novos::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_overlord_drakuru_betrayal::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_nightbane::MovementInform(), npc_harrison_jones::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), boss_volkhan::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_wild_wyrm::MovementInform(), npc_akama_illidan::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_janalai_hatcher::MoveToNewWaypoint(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), spell_halion_twilight_phasing_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::OnRemove(), spell_halion_twilight_phasing_aura::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_wild_wyrm::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_preparations_for_war_vehicle::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), boss_felblood_kaelthas::Reset(), npc_acherus_necromancer::npc_acherus_necromancerAI::Reset(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_janalai::Reset(), npc_janalai_hatcher::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), boss_taldaram::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_alar::ScheduleAbilities(), boss_illidan_stormrage::ScheduleAbilities(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_felmyst::ScheduleGroundAbilities(), boss_nightbane::ScheduleLand(), boss_loken::ScheduleTasks(), boss_laj::ScheduleTasks(), Map::ScriptsProcess(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetConfused(), SmartAI::SetCurrentRangeMode(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::sGossipSelect(), boss_thorim::boss_thorimAI::SpawnAnArenaNPC(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), boss_attumen::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_forest_frog::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), FollowerAI::StartFollow(), boss_felmyst::StartIntro(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_highborne_lamenter::npc_highborne_lamenterAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::UpdateAI(), npc_forest_frog::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_spark_of_ionar::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), Player::UpdateCharmedAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_jenny::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
1739{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1951{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
1052{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11323{
11324 Player* player = nullptr;
11325 if (IsPlayer())
11326 player = ToPlayer();
11327 // Should we enable this also for charmed units?
11328 else if (IsCreature() && IsPet())
11329 player = GetOwner()->ToPlayer();
11330
11331 if (!player)
11332 return nullptr;
11333 Group* group = player->GetGroup();
11334 // When there is no group check pet presence
11335 if (!group)
11336 {
11337 // We are pet now, return owner
11338 if (player != this)
11339 return IsWithinDistInMap(player, radius) ? player : nullptr;
11340 Unit* pet = GetGuardianPet();
11341 // No pet, no group, nothing to return
11342 if (!pet)
11343 return nullptr;
11344 // We are owner now, return pet
11345 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11346 }
11347
11348 std::vector<Unit*> nearMembers;
11349 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11350 nearMembers.reserve(group->GetMembersCount() * 2);
11351
11352 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11353 if (Player* Target = itr->GetSource())
11354 {
11355 if (Target != this && !IsWithinDistInMap(Target, radius))
11356 continue;
11357
11358 // IsHostileTo check duel and controlled by enemy
11359 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11360 nearMembers.push_back(Target);
11361
11362 // Push player's pet to vector
11363 if (Unit* pet = Target->GetGuardianPet())
11364 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11365 nearMembers.push_back(pet);
11366 }
11367
11368 if (nearMembers.empty())
11369 return nullptr;
11370
11371 uint32 randTarget = urand(0, nearMembers.size() - 1);
11372 return nearMembers[randTarget];
11373}
Definition GroupReference.h:27
Definition Group.h:169
uint32 GetMembersCount() const
Definition Group.h:245
GroupReference * GetFirstMember()
Definition Group.h:243
Group * GetGroup()
Definition Player.h:2482
Guardian * GetGuardianPet() const
Definition Unit.cpp:10855
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1347

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::IsCreature(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), Object::ToPlayer(), and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
845{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4880{
4881 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4882 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4883 {
4884 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4885 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4886 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4887 && (!except || except != itr->second))
4888 {
4889 return itr->second;
4890 }
4891 }
4892 return nullptr;
4893}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition Unit.h:661

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1359{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
Todo:
: move this in Object class or move GetUInt32value here but keep consistency
10805{
10806 if (ObjectGuid ownerGUID = GetOwnerGUID())
10807 return ObjectAccessor::GetUnit(*this, ownerGUID);
10808
10809 return nullptr;
10810}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), spell_warl_generic_scaling::CalculateAPAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), boss_illidari_council_memberAI::EnterEvadeMode(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), spell_item_fetch_ball::SelectTarget(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
19067{
19068 Unit* owner = GetCharmerOrOwnerOrSelf();
19069 Group* group = nullptr;
19070 if (owner->IsPlayer())
19071 group = owner->ToPlayer()->GetGroup();
19072
19073 if (group)
19074 {
19075 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
19076
19077 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
19078 {
19079 Player* Target = itr->GetSource();
19080
19081 // IsHostileTo check duel and controlled by enemy
19082 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
19083 {
19084 if (Target->IsAlive())
19085 TagUnitMap.push_back(Target);
19086
19087 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
19088 {
19089 if (Unit* pet = *iterator)
19090 if (pet->IsGuardian() && pet->IsAlive())
19091 TagUnitMap.push_back(pet);
19092 }
19093 }
19094 }
19095 }
19096 else
19097 {
19098 if (owner->IsAlive())
19099 TagUnitMap.push_back(owner);
19100
19101 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
19102 {
19103 if (Unit* pet = *itr)
19104 if (pet->IsGuardian() && pet->IsAlive())
19105 TagUnitMap.push_back(pet);
19106 }
19107 }
19108}
uint8 GetSubGroup() const
Definition Player.h:2486

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), Object::IsPlayer(), m_Controlled, and Object::ToPlayer().

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPctModifierValue()

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19286{
19287 uint32 currentPhase = 0;
19289 if (!phases.empty())
19290 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19291 currentPhase |= (*itr)->GetMiscValue();
19292
19293 return currentPhase;
19294}
@ SPELL_AURA_PHASE
Definition SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
1051{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
1120{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_igb_cannon_blast::CalculatePower(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), boss_shade_of_aran::JustEngagedWith(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::StoreEnergy(), Aura::Update(), boss_moam::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
1122{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1121
uint32 GetPower(Powers power) const
Definition Unit.h:1120

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15642{
15643 switch (unitMod)
15644 {
15645 case UNIT_MOD_RAGE:
15646 return POWER_RAGE;
15647 case UNIT_MOD_FOCUS:
15648 return POWER_FOCUS;
15649 case UNIT_MOD_ENERGY:
15650 return POWER_ENERGY;
15651 case UNIT_MOD_HAPPINESS:
15652 return POWER_HAPPINESS;
15653 case UNIT_MOD_RUNE:
15654 return POWER_RUNE;
15656 return POWER_RUNIC_POWER;
15657 default:
15658 case UNIT_MOD_MANA:
15659 return POWER_MANA;
15660 }
15661}
@ UNIT_MOD_RUNE
Definition Unit.h:161
@ UNIT_MOD_ENERGY
Definition Unit.h:159
@ UNIT_MOD_FOCUS
Definition Unit.h:158
@ UNIT_MOD_HAPPINESS
Definition Unit.h:160
@ UNIT_MOD_MANA
Definition Unit.h:156
@ UNIT_MOD_RAGE
Definition Unit.h:157
@ UNIT_MOD_RUNIC_POWER
Definition Unit.h:162

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by UpdateUnitMod().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13601{
13602 // proc per minute chance calculation
13603 if (PPM <= 0)
13604 return 0.0f;
13605
13606 // Apply chance modifer aura
13607 if (spellProto)
13608 if (Player* modOwner = GetSpellModOwner())
13609 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13610
13611 return (WeaponSpeed * PPM) / 600.0f; // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13612}
@ SPELLMOD_PROC_PER_MINUTE
Definition SpellDefines.h:102

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16731{
16732 // use provided list of auras which can proc
16733 if (procAuras)
16734 {
16735 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16736 {
16737 ASSERT((*itr)->GetTarget() == this);
16738 if (!(*itr)->GetRemoveMode())
16739 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16740 {
16741 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16742 aurasTriggeringProc.push_back(*itr);
16743 }
16744 }
16745 }
16746 // or generate one on our own
16747 else
16748 {
16749 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16750 {
16751 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16752 {
16753 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16754 aurasTriggeringProc.push_back(itr->second);
16755 }
16756 }
16757 }
16758}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
21099{
21100 if (IsPlayer())
21101 {
21102 if (original)
21103 return m_realRace;
21104 else
21105 return m_race;
21106 }
21107
21109}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CheckSkillLearnedBySpell(), Player::CreateCorpse(), GetModelForForm(), ObjectMgr::GetModelForShapeshift(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Creature::IsValidTrainerForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), InstanceScript::OnPlayerLeave(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
715{
716 float combat_reach = GetCombatReach();
717 if (combat_reach < 0.1f) // sometimes bugged for players
718 combat_reach = DEFAULT_COMBAT_REACH;
719
720 uint32 attacker_number = getAttackers().size();
721 if (attacker_number > 0)
722 --attacker_number;
723 Creature const* c = obj->ToCreature();
724 if (c)
725 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
726 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
727
728 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
729 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
730
731 // pussywizard
732 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
733 {
734 x = this->GetPositionX();
735 y = this->GetPositionY();
736 z = this->GetPositionZ();
737 obj->UpdateAllowedPositionZ(x, y, z);
738 }
739 float maxDist = GetMeleeRange(obj);
740 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
741 {
742 if (force)
743 {
744 x = this->GetPositionX();
745 y = this->GetPositionY();
746 z = this->GetPositionZ();
747 return true;
748 }
749 return false;
750 }
751 return true;
752}
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:45
bool IsDungeonBoss() const
Definition Creature.cpp:3176
bool isControlled() const
Definition Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition Unit.cpp:21198
float GetMeleeRange(Unit const *target) const
Definition Unit.cpp:683
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition Object.cpp:1352
float GetExactDistSq(float x, float y, float z) const
Definition Position.h:174

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10244{
10245 // always friendly to self
10246 if (this == target)
10247 return REP_FRIENDLY;
10248
10249 // always friendly to charmer or owner
10251 return REP_FRIENDLY;
10252
10253 Player const* selfPlayerOwner = GetAffectingPlayer();
10254 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10255
10256 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10257 if (selfPlayerOwner)
10258 {
10259 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10260 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10261 return *repRank;
10262 }
10263 else if (targetPlayerOwner)
10264 {
10265 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10266 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10267 return *repRank;
10268 }
10269
10271 {
10272 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10273 {
10274 if (selfPlayerOwner && targetPlayerOwner)
10275 {
10276 // always friendly to other unit controlled by player, or to the player himself
10277 if (selfPlayerOwner == targetPlayerOwner)
10278 return REP_FRIENDLY;
10279
10280 // duel - always hostile to opponent
10281 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10282 return REP_HOSTILE;
10283
10284 // same group - checks dependant only on our faction - skip FFA_PVP for example
10285 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10286 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10287 // however client seems to allow mixed group parties, because in 13850 client it works like:
10288 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10289 }
10290
10291 // check FFA_PVP
10292 if (IsFFAPvP() && target->IsFFAPvP())
10293 return REP_HOSTILE;
10294
10295 if (selfPlayerOwner)
10296 {
10297 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10298 {
10299 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10300 return *repRank;
10301 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10302 {
10303 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10304 {
10305 if (targetFactionEntry->CanHaveReputation())
10306 {
10307 // check contested flags
10308 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10309 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10310 return REP_HOSTILE;
10311
10312 // if faction has reputation, hostile state depends only from AtWar state
10313 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10314 return REP_HOSTILE;
10315 return REP_FRIENDLY;
10316 }
10317 }
10318 }
10319 }
10320 }
10321 }
10322 }
10323
10324 ReputationRank repRank = REP_HATED;
10325 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10326 {
10327 return ReputationRank(repRank);
10328 }
10329
10330 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10331 if (checkOriginalFaction)
10332 {
10333 if (IsPlayer())
10334 {
10335 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10336 {
10337 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10338 }
10339 }
10340 else
10341 {
10342 Unit* owner = GetOwner();
10343 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10344 {
10345 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10346 }
10347 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10348 {
10349 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10350 }
10351 }
10352 }
10353
10354 if (!factionTemplateEntry)
10355 {
10356 factionTemplateEntry = GetFactionTemplateEntry();
10357 }
10358
10359 // do checks dependant only on our faction
10360 return GetFactionReactionTo(factionTemplateEntry, target);
10361}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1110
bool IsAtWar(uint32 faction_id) const
Definition ReputationMgr.cpp:55
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition Unit.cpp:10363
bool IsInRaidWith(Unit const *unit) const
Definition Unit.cpp:19044
Definition DBCStructure.h:679

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition ThreatMgr.h:299

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20309{
20310 int32 resist = -1;
20311 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20312 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20313 resist = int32(GetResistance(SpellSchools(i)));
20314
20315 // resist value will never be negative here
20316 return uint32(resist);
20317}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
1182{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition UnitDefines.h:125

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
1161 {
1162 uint32 value = GetShieldBlockValue();
1163 if (value >= hard_cap)
1164 {
1165 value = (soft_cap + hard_cap) / 2;
1166 }
1167 else if (value > soft_cap)
1168 {
1169 value = soft_cap + ((value - soft_cap) / 2);
1170 }
1171
1172 return value;
1173 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1415{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15253{
15254 if (!spellInfo->RangeEntry)
15255 {
15256 return 0;
15257 }
15258
15259 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15260 {
15261 return spellInfo->GetMaxRange();
15262 }
15263
15264 if (!target)
15265 {
15266 return spellInfo->GetMaxRange(true);
15267 }
15268
15269 return spellInfo->GetMaxRange(!IsHostileTo(target));
15270}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15273{
15274 if (!spellInfo->RangeEntry)
15275 {
15276 return 0;
15277 }
15278
15279 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15280 {
15281 return spellInfo->GetMinRange();
15282 }
15283
15284 return spellInfo->GetMinRange(!IsHostileTo(target));
15285}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16795{
16796 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16797 {
16798 return player;
16799 }
16800
16801 if (Unit* owner = GetOwner())
16802 {
16803 if (Player* player = owner->ToPlayer())
16804 {
16805 return player;
16806 }
16807 }
16808
16809 // Special handling for Eye of Kilrogg
16811 {
16812 if (TempSummon const* tempSummon = ToTempSummon())
16813 {
16814 if (Unit* summoner = tempSummon->GetSummonerUnit())
16815 {
16816 return summoner->ToPlayer();
16817 }
16818 }
16819 }
16820
16821 return nullptr;
16822}
@ NPC_EYE_OF_KILROGG
Definition PetDefines.h:102
Definition TemporarySummon.h:40

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), SpellHealingBonusTaken(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15581{
15583
15584 switch (unitMod)
15585 {
15587 school = SPELL_SCHOOL_HOLY;
15588 break;
15590 school = SPELL_SCHOOL_FIRE;
15591 break;
15593 school = SPELL_SCHOOL_NATURE;
15594 break;
15596 school = SPELL_SCHOOL_FROST;
15597 break;
15599 school = SPELL_SCHOOL_SHADOW;
15600 break;
15602 school = SPELL_SCHOOL_ARCANE;
15603 break;
15604
15605 default:
15606 break;
15607 }
15608
15609 return school;
15610}
@ SPELL_SCHOOL_SHADOW
Definition SharedDefines.h:299
@ SPELL_SCHOOL_NATURE
Definition SharedDefines.h:297
@ SPELL_SCHOOL_FROST
Definition SharedDefines.h:298
@ SPELL_SCHOOL_ARCANE
Definition SharedDefines.h:300
@ SPELL_SCHOOL_FIRE
Definition SharedDefines.h:296
@ SPELL_SCHOOL_HOLY
Definition SharedDefines.h:295
@ UNIT_MOD_RESISTANCE_SHADOW
Definition Unit.h:168
@ UNIT_MOD_RESISTANCE_FROST
Definition Unit.h:167
@ UNIT_MOD_RESISTANCE_HOLY
Definition Unit.h:164
@ UNIT_MOD_RESISTANCE_ARCANE
Definition Unit.h:169
@ UNIT_MOD_RESISTANCE_FIRE
Definition Unit.h:165
@ UNIT_MOD_RESISTANCE_NATURE
Definition Unit.h:166

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by UpdateUnitMod().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15613{
15614 Stats stat = STAT_STRENGTH;
15615
15616 switch (unitMod)
15617 {
15619 stat = STAT_STRENGTH;
15620 break;
15622 stat = STAT_AGILITY;
15623 break;
15625 stat = STAT_STAMINA;
15626 break;
15628 stat = STAT_INTELLECT;
15629 break;
15631 stat = STAT_SPIRIT;
15632 break;
15633
15634 default:
15635 break;
15636 }
15637
15638 return stat;
15639}
Stats
Definition SharedDefines.h:268
@ STAT_SPIRIT
Definition SharedDefines.h:273
@ STAT_INTELLECT
Definition SharedDefines.h:272
@ STAT_AGILITY
Definition SharedDefines.h:270
@ STAT_STRENGTH
Definition SharedDefines.h:269
@ STAT_STAMINA
Definition SharedDefines.h:271
@ UNIT_MOD_STAT_INTELLECT
Definition Unit.h:153
@ UNIT_MOD_STAT_SPIRIT
Definition Unit.h:154
@ UNIT_MOD_STAT_STRENGTH
Definition Unit.h:150
@ UNIT_MOD_STAT_AGILITY
Definition Unit.h:151
@ UNIT_MOD_STAT_STAMINA
Definition Unit.h:152

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by UpdateUnitMod().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
943{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), boss_alar::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), spell_black_knight_ghoul_claw::HandleSpellHit(), boss_hadronox::IsInCombatWithPlayer(), boss_attumen::IsSummonedBy(), boss_talon_king_ikiss::JustEngagedWith(), boss_blackheart_the_inciter::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), PowerUsersSelector::operator()(), MalleableGooSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_eck::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_molten_golem::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
944{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15664{
15665 if (attType == RANGED_ATTACK)
15666 {
15668 if (victim)
15669 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15670
15671 if (ap < 0)
15672 return 0.0f;
15674 }
15675 else
15676 {
15678 if (victim)
15679 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15680
15681 if (ap < 0)
15682 return 0.0f;
15684 }
15685}
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:228
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition UpdateFields.h:166
int32 GetInt32Value(uint16 index) const
Definition Object.cpp:288

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier() [1/2]

int32 Unit::GetTotalAuraModifier ( AuraType  auratype) const
6127{
6128 return GetTotalAuraModifier(auraType, [](AuraEffect const* /*aurEff*/) { return true; });
6129}

References GetTotalAuraModifier().

Referenced by Player::AddSpellAndCategoryCooldowns(), CalcArmorReducedDamage(), Aura::CalcDispelChance(), CalculateMeleeDamage(), Player::CalculateReputationGain(), CalculateSpellDamageTaken(), DealMeleeDamage(), Spell::Delayed(), Spell::DelayedChannel(), Creature::GetAggroRange(), Creature::GetAttackDistance(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitMissChance(), GetUnitParryChance(), Player::HandleFall(), isBlockCritical(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), RecalculateObjectScale(), Creature::RegenerateHealth(), Player::RegenerateHealth(), RewardRage(), RollMeleeOutcomeAgainst(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHitResult(), SpellHitResult(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), UpdateDamageDoneMods(), Player::UpdateDodgePercentage(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateMeleeHitChances(), Player::UpdateParryPercentage(), Player::UpdateRangedHitChances(), UpdateResistanceBuffModsMod(), UpdateSpeed(), Player::UpdateSpellCritChance(), Player::UpdateSpellHitChances(), UpdateStatBuffMod(), and Player::UpdateWeaponDependentCritAuras().

◆ GetTotalAuraModifier() [2/2]

int32 Unit::GetTotalAuraModifier ( AuraType  auratype,
std::function< bool(AuraEffect const *)> const &  predicate 
) const
6041{
6042 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auraType);
6043 if (mTotalAuraList.empty())
6044 return 0;
6045
6046 std::map<SpellGroup, int32> sameEffectSpellGroup;
6047 int32 modifier = 0;
6048
6049 for (AuraEffect const* aurEff : mTotalAuraList)
6050 {
6051 if (predicate(aurEff))
6052 {
6053 // Check if the Aura Effect has a the Same Effect Stack Rule and if so, use the highest amount of that SpellGroup
6054 // If the Aura Effect does not have this Stack Rule, it returns false so we can add to the multiplier as usual
6055 if (!sSpellMgr->AddSameEffectStackRuleSpellGroups(aurEff->GetSpellInfo(), static_cast<uint32>(auraType), aurEff->GetAmount(), sameEffectSpellGroup))
6056 modifier += aurEff->GetAmount();
6057 }
6058 }
6059
6060 // Add the highest of the Same Effect Stack Rule SpellGroups to the accumulator
6061 for (auto const& [_, amount] : sameEffectSpellGroup)
6062 modifier += amount;
6063
6064 return modifier;
6065}

References GetAuraEffectsByType(), and sSpellMgr.

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6227{
6228 return GetTotalAuraModifier(auraType, [affectedSpell](AuraEffect const* aurEff) -> bool
6229 {
6230 if (aurEff->IsAffectedOnSpell(affectedSpell))
6231 return true;
6232 return false;
6233 });
6234}

References GetTotalAuraModifier(), and AuraEffect::IsAffectedOnSpell().

Referenced by Spell::SelectImplicitAreaTargets(), and Spell::SelectImplicitConeTargets().

◆ GetTotalAuraModifierByMiscMask()

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6187{
6188 return GetTotalAuraModifier(auraType, [miscValue](AuraEffect const* aurEff) -> bool
6189 {
6190 if (aurEff->GetMiscValue() == miscValue)
6191 return true;
6192 return false;
6193 });
6194}

References AuraEffect::GetMiscValue(), and GetTotalAuraModifier().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15563{
15564 if (unitMod >= UNIT_MOD_END)
15565 {
15566 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15567 return 0.0f;
15568 }
15569
15570 if (GetPctModifierValue(unitMod, TOTAL_PCT) <= 0.0f)
15571 return 0.0f;
15572
15573 float value = GetFlatModifierValue(unitMod, BASE_VALUE);
15574 value *= GetPctModifierValue(unitMod, BASE_PCT);
15575 value += GetFlatModifierValue(unitMod, TOTAL_VALUE);
15576 value *= GetPctModifierValue(unitMod, TOTAL_PCT);
15577 return value;
15578}
float GetPctModifierValue(UnitMods unitMod, UnitModifierPctType modifierType) const
Definition Unit.cpp:15392
float GetFlatModifierValue(UnitMods unitMod, UnitModifierFlatType modifierType) const
Definition Unit.cpp:15381

References BASE_PCT, BASE_VALUE, GetFlatModifierValue(), GetPctModifierValue(), LOG_ERROR, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier() [1/2]

◆ GetTotalAuraMultiplier() [2/2]

float Unit::GetTotalAuraMultiplier ( AuraType  auraType,
std::function< bool(AuraEffect const *)> const &  predicate 
) const
6068{
6069 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auraType);
6070 if (mTotalAuraList.empty())
6071 return 1.0f;
6072
6073 std::map<SpellGroup, int32> sameEffectSpellGroup;
6074 float multiplier = 1.0f;
6075
6076 for (AuraEffect const* aurEff : mTotalAuraList)
6077 {
6078 if (predicate(aurEff))
6079 {
6080 // Check if the Aura Effect has a the Same Effect Stack Rule and if so, use the highest amount of that SpellGroup
6081 // If the Aura Effect does not have this Stack Rule, it returns false so we can add to the multiplier as usual
6082 if (!sSpellMgr->AddSameEffectStackRuleSpellGroups(aurEff->GetSpellInfo(), static_cast<uint32>(auraType), aurEff->GetAmount(), sameEffectSpellGroup))
6083 AddPct(multiplier, aurEff->GetAmount());
6084 }
6085 }
6086
6087 // Add the highest of the Same Effect Stack Rule SpellGroups to the multiplier
6088 for (auto itr = sameEffectSpellGroup.begin(); itr != sameEffectSpellGroup.end(); ++itr)
6089 AddPct(multiplier, itr->second);
6090
6091 return multiplier;
6092}

References AddPct(), GetAuraEffectsByType(), and sSpellMgr.

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6237{
6238 return GetTotalAuraMultiplier(auraType, [affectedSpell](AuraEffect const* aurEff) -> bool
6239 {
6240 if (aurEff->IsAffectedOnSpell(affectedSpell))
6241 return true;
6242 return false;
6243 });
6244}

References GetTotalAuraMultiplier(), and AuraEffect::IsAffectedOnSpell().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6197{
6198 return GetTotalAuraMultiplier(auraType, [miscValue](AuraEffect const* aurEff) -> bool
6199 {
6200 if (aurEff->GetMiscValue() == miscValue)
6201 return true;
6202 return false;
6203 });
6204}

References AuraEffect::GetMiscValue(), and GetTotalAuraMultiplier().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent(), Creature::Regenerate(), Player::Regenerate(), Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15547{
15548 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15549
15550 if (GetPctModifierValue(unitMod, TOTAL_PCT) <= 0.0f)
15551 return 0.0f;
15552
15553 // value = ((base_value * base_pct) + total_value) * total_pct
15554 float value = GetFlatModifierValue(unitMod, BASE_VALUE) + GetCreateStat(stat);
15555 value *= GetPctModifierValue(unitMod, BASE_PCT);
15556 value += GetFlatModifierValue(unitMod, TOTAL_VALUE) + additionalValue;
15557 value *= GetPctModifierValue(unitMod, TOTAL_PCT);
15558
15559 return value;
15560}
UnitMods
Definition Unit.h:149
@ UNIT_MOD_STAT_START
Definition Unit.h:177
float GetCreateStat(Stats stat) const
Definition Unit.h:1048

References BASE_PCT, BASE_VALUE, GetCreateStat(), GetFlatModifierValue(), GetPctModifierValue(), TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3732{
3733 if (Player const* player = ToPlayer())
3734 {
3735 if (player->CanBlock())
3736 {
3737 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3738 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3740 }
3741 // is player but has no block ability or no not broken shield equipped
3742 return 0.0f;
3743 }
3744 else
3745 {
3746 if (ToCreature()->IsTotem())
3747 return 0.0f;
3748 else
3749 {
3750 float block = 5.0f;
3752 return block > 0.0f ? block : 0.0f;
3753 }
3754 }
3755}
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:686
#define INVENTORY_SLOT_BAG_0
Definition Player.h:665
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition SpellAuraDefines.h:114
@ PLAYER_BLOCK_PERCENTAGE
Definition UpdateFields.h:346
bool IsBroken() const
Definition Item.h:257
uint32 Block
Definition ItemTemplate.h:674

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3758{
3759 float crit;
3760
3761 if (IsPlayer())
3762 {
3763 switch (attackType)
3764 {
3765 case BASE_ATTACK:
3767 break;
3768 case OFF_ATTACK:
3770 break;
3771 case RANGED_ATTACK:
3773 break;
3774 // Just for good manner
3775 default:
3776 crit = 0.0f;
3777 break;
3778 }
3779 }
3780 else
3781 {
3782 crit = 5.0f;
3785 }
3786
3787 // flat aura mods
3788 if (attackType == RANGED_ATTACK)
3789 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3790 else
3791 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3792
3793 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, [this](AuraEffect const* aurEff)
3794 {
3795 return GetGUID() == aurEff->GetCasterGUID();
3796 });
3797
3798 // reduce crit chance from Rating for players
3799 if (attackType != RANGED_ATTACK)
3800 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3801 else
3802 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3803
3804 // Apply crit chance from defence skill
3805 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3806
3807 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3808 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3809
3810 if (crit < 0.0f)
3811 crit = 0.0f;
3812 return crit;
3813}
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition SpellAuraDefines.h:260
@ SPELL_AURA_MOD_CRIT_PCT
Definition SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition SpellAuraDefines.h:115
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition UpdateFields.h:353
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition Unit.h:1189

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, AuraEffect::GetCasterGUID(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3670{
3671 if (IsPlayer())
3672 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3673 else
3674 {
3675 if (ToCreature()->IsTotem())
3676 return 0.0f;
3677 else
3678 {
3679 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3681 return dodge > 0.0f ? dodge : 0.0f;
3682 }
3683 }
3684}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition SpellAuraDefines.h:112
float GetRealDodge() const
Definition Player.h:2618

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::IsPlayer(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline

Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.

UnitFlags2
Definition UnitDefines.h:291
@ UNIT_FIELD_FLAGS_2
Definition UpdateFields.h:118

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
1175{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3717{
3718 float miss_chance = 5.00f;
3719
3720 if (Player const* player = ToPlayer())
3721 miss_chance += player->GetMissPercentageFromDefence();
3722
3723 if (attType == RANGED_ATTACK)
3725 else
3727
3728 return miss_chance;
3729}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3687{
3688 float chance = 0.0f;
3689
3690 if (Player const* player = ToPlayer())
3691 {
3692 if (player->CanParry())
3693 {
3694 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3695 if (!tmpitem)
3696 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3697
3698 if (tmpitem)
3699 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3700 }
3701 }
3702 else if (IsCreature())
3703 {
3704 if (ToCreature()->isWorldBoss())
3705 chance = 13.4f; // + 0.6 by skill diff
3707 chance = 5.0f;
3708
3709 // Xinef: if aura is present, type should not matter
3711 }
3712
3713 return chance > 0.0f ? chance : 0.0f;
3714}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::IsCreature(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
733{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1905{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), WorldSession::HandleMoverRelocation(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::npc_nexus_lordAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1904{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::boss_xt002AI::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), Object::BuildMovementUpdate(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), MotionTransport::DelayedTeleportTransport(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::npc_ulduar_vx001AI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::npc_hover_diskAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_hyldsmeet_protodrake::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
893{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), Attack(), PetAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::boss_malygosAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_isalien::DamageTaken(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), SmartAI::DistanceYourself(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), AssistDelayEvent::Execute(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::ExecuteEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), boss_attumen::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_shade_of_aran::JustEngagedWith(), boss_akilzon::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_overlord_drakuru_betrayal::JustEngagedWith(), npc_yor::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_sacrolash::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_kiljaeden::ScheduleBasicAbilities(), npc_sunblade_scout::ScheduleCombat(), npc_amanishi_scout::ScheduleCombat(), boss_taldaram::ScheduleCombatEvents(), boss_magtheridon::ScheduleCombatEvents(), npc_thaladred::ScheduleEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), boss_dred::boss_dredAI::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), SmartAI::SetCombatMovement(), SetConfused(), SmartAI::SetCurrentRangeMode(), SetFeared(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), SummonCroneIfReady(), boss_akilzon::SummonEagles(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::UseAbility().

◆ GetVirtualItemId()

uint32 Unit::GetVirtualItemId ( uint32  slot) const
21260{
21261 if (slot >= MAX_EQUIPMENT_ITEMS)
21262 return 0;
21263
21265}
#define MAX_EQUIPMENT_ITEMS
Definition CreatureData.h:35
@ UNIT_VIRTUAL_ITEM_SLOT_ID
Definition UpdateFields.h:116

References Object::GetUInt32Value(), MAX_EQUIPMENT_ITEMS, and UNIT_VIRTUAL_ITEM_SLOT_ID.

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1526 {
1527 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1528 if (itr != m_visibleAuras.end())
1529 return itr->second;
1530 return nullptr;
1531 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15688{
15689 if (attType == OFF_ATTACK && !HasOffhandWeaponForAttack())
15690 return 0.0f;
15691
15692 return m_weaponDamage[attType][type][damageIndex];
15693}

References HasOffhandWeaponForAttack(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13590{
13591 // normalized proc chance for weapon attack speed
13592 // (odd formula...)
13594 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13596 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13597 return 0;
13598}

References BASE_ATTACK, GetAttackTime(), HasOffhandWeaponForAttack(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3816{
3817 uint32 value = 0;
3818 if (Player const* player = ToPlayer())
3819 {
3820 Item* item = player->GetWeaponForAttack(attType, true);
3821
3822 // feral or unarmed skill only for base attack
3823 if (attType != BASE_ATTACK && !item)
3824 return 0;
3825
3826 if (IsInFeralForm())
3827 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3828
3829 // weapon skill or (unarmed for base attack)
3830 uint32 skill = SKILL_UNARMED;
3831 if (item)
3832 skill = item->GetSkill();
3833
3834 // in PvP use full skill instead current skill value
3835 value = (target && target->IsControlledByPlayer())
3836 ? player->GetMaxSkillValue(skill)
3837 : player->GetSkillValue(skill);
3838 // Modify value from ratings
3839 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3840 switch (attType)
3841 {
3842 case BASE_ATTACK:
3843 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3844 break;
3845 case OFF_ATTACK:
3846 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3847 break;
3848 case RANGED_ATTACK:
3849 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3850 break;
3851 default:
3852 break;
3853 }
3854 }
3855 else
3856 value = GetUnitMeleeSkill(target);
3857 return value;
3858}
@ SKILL_UNARMED
Definition SharedDefines.h:3157
@ CR_WEAPON_SKILL_RANGED
Definition Unit.h:246
@ CR_WEAPON_SKILL
Definition Unit.h:224
@ CR_WEAPON_SKILL_OFFHAND
Definition Unit.h:245
@ CR_WEAPON_SKILL_MAINHAND
Definition Unit.h:244
uint32 GetSkill()
Definition Item.cpp:555
bool IsInFeralForm() const
Definition Unit.h:1939

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8943{
8944 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8945
8946 switch (dummySpell->SpellFamilyName)
8947 {
8949 switch (dummySpell->Id)
8950 {
8951 // Nevermelting Ice Crystal
8952 case 71564:
8953 RemoveAuraFromStack(71564);
8954 *handled = true;
8955 break;
8956 // Gaseous Bloat
8957 case 70672:
8958 case 72455:
8959 case 72832:
8960 case 72833:
8961 {
8962 if (Unit* caster = triggeredByAura->GetCaster())
8963 if (victim && caster->GetGUID() == victim->GetGUID())
8964 {
8965 *handled = true;
8966 uint32 stack = triggeredByAura->GetStackAmount();
8967 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8968 int32 dmg = 0;
8969 for (uint8 i = 1; i <= stack; ++i)
8970 dmg += mod * i;
8971 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8972 }
8973 break;
8974 }
8975 // Ball of Flames Proc
8976 case 71756:
8977 case 72782:
8978 case 72783:
8979 case 72784:
8980 RemoveAuraFromStack(dummySpell->Id);
8981 *handled = true;
8982 break;
8983 // Discerning Eye of the Beast
8984 case 59915:
8985 {
8986 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8987 *handled = true;
8988 break;
8989 }
8990 // Swift Hand of Justice
8991 case 59906:
8992 {
8993 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8994 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8995 *handled = true;
8996 break;
8997 }
8998 }
8999
9000 break;
9001 case SPELLFAMILY_MAGE:
9002 {
9003 // Combustion
9004 switch (dummySpell->Id)
9005 {
9006 case 11129:
9007 {
9008 *handled = true;
9009 Unit* caster = triggeredByAura->GetCaster();
9010 if (!caster || !damage)
9011 return false;
9012
9013 // last charge and crit
9014 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
9015 return true; // charge counting (will removed)
9016
9017 CastSpell(this, 28682, true);
9018
9019 return procEx & PROC_EX_CRITICAL_HIT;
9020 }
9021 // Empowered Fire
9022 case 31656:
9023 case 31657:
9024 case 31658:
9025 {
9026 *handled = true;
9027
9028 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
9029 if (!spInfo)
9030 return false;
9031
9032 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
9033 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
9034 return true;
9035 }
9036 }
9037 break;
9038 }
9040 {
9041 // Blood of the North
9042 // Reaping
9043 // Death Rune Mastery
9044 // xinef: Icon 22 is used for item bonus, skip
9045 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
9046 {
9047 *handled = true;
9048 // Convert recently used Blood Rune to Death Rune
9049 if (Player* player = ToPlayer())
9050 {
9051 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
9052 return false;
9053
9054 // xinef: not true
9055 //RuneType rune = ToPlayer()->GetLastUsedRune();
9056 // can't proc from death rune use
9057 //if (rune == RUNE_DEATH)
9058 // return false;
9059 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
9060 if (!aurEff)
9061 return false;
9062
9063 // Reset amplitude - set death rune remove timer to 30s
9064 aurEff->ResetPeriodic(true);
9065 uint32 runesLeft;
9066
9067 if (dummySpell->SpellIconID == 2622)
9068 runesLeft = 2;
9069 else
9070 runesLeft = 1;
9071
9072 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
9073 {
9074 if (dummySpell->SpellIconID == 2622)
9075 {
9076 if (player->GetCurrentRune(i) == RUNE_DEATH ||
9077 player->GetBaseRune(i) == RUNE_BLOOD)
9078 continue;
9079 }
9080 else
9081 {
9082 if (player->GetCurrentRune(i) == RUNE_DEATH ||
9083 player->GetBaseRune(i) != RUNE_BLOOD)
9084 continue;
9085 }
9086 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
9087 continue;
9088
9089 --runesLeft;
9090 // Mark aura as used
9091 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
9092 }
9093 return true;
9094 }
9095 return false;
9096 }
9097 break;
9098 }
9100 {
9101 switch (dummySpell->Id)
9102 {
9103 // Item - Warrior T10 Protection 4P Bonus
9104 case 70844:
9105 {
9106 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
9107 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
9108 break;
9109 }
9110 default:
9111 break;
9112 }
9113 break;
9114 }
9115 case SPELLFAMILY_SHAMAN:
9116 {
9117 // Flurry
9118 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
9119 {
9120 if (cooldown)
9121 {
9122 if (HasSpellCooldown(dummySpell->Id))
9123 {
9124 *handled = true;
9125 break;
9126 }
9127
9128 AddSpellCooldown(dummySpell->Id, 0, cooldown);
9129 }
9130 }
9131 break;
9132 }
9133 }
9134 return false;
9135}
@ RUNE_DEATH
Definition Player.h:408
@ RUNE_BLOOD
Definition Player.h:405
@ EFFECT_1
Definition SharedDefines.h:32
@ SPELLFAMILY_MAGE
Definition SharedDefines.h:3797
@ SPELLFAMILY_GENERIC
Definition SharedDefines.h:3794
@ SPELLFAMILY_WARRIOR
Definition SharedDefines.h:3798
@ SPELLFAMILY_SHAMAN
Definition SharedDefines.h:3805
@ SPELLFAMILY_DEATHKNIGHT
Definition SharedDefines.h:3809
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition SpellAuras.h:176
uint8 GetSpawnMode() const
Definition Map.h:267
virtual bool HasSpellCooldown(uint32) const
Definition Unit.h:1320
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition Unit.h:1322
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5044

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17910{
17911 // aura can be deleted at casts
17912 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17913
17914 uint32 damageSpellId;
17915 switch (spellProto->Id)
17916 {
17917 case 57949: // shiver
17918 damageSpellId = 57952;
17919 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17920 break;
17921 case 59978: // shiver
17922 damageSpellId = 59979;
17923 break;
17924 case 43593: // Cold Stare
17925 damageSpellId = 43594;
17926 break;
17927 default:
17928 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17929 return false;
17930 }
17931
17932 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17933
17934 // jumps
17935 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17936
17937 // current aura expire
17938 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17939
17940 // next target selection
17941 if (jumps > 0)
17942 {
17943 if (Unit* caster = triggeredByAura->GetCaster())
17944 {
17945 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17946 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17947 {
17948 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17949 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17950 aura->SetCharges(jumps);
17951 }
17952 }
17953 }
17954
17955 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17956
17957 return true;
17958}
void SetCharges(uint8 charges)
Definition SpellAuras.cpp:894
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition Unit.cpp:11322

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17821{
17822 // aura can be deleted at casts
17823 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17824 int32 heal = triggeredByAura->GetAmount();
17825 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17826
17827 // Currently only Prayer of Mending
17828 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17829 {
17830 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17831 return false;
17832 }
17833
17834 // jumps
17835 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17836
17837 // current aura expire
17838 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17839
17840 // next target selection
17841 if (jumps > 0)
17842 {
17843 if (Unit* caster = triggeredByAura->GetCaster())
17844 {
17845 // smart healing
17846 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17847 std::list<Unit*> nearMembers;
17848
17849 Player* player = nullptr;
17850 if (IsPlayer())
17851 player = ToPlayer();
17852 else if (GetOwner())
17853 player = GetOwner()->ToPlayer();
17854
17855 if (player)
17856 {
17857 Group* group = player->GetGroup();
17858 if (!group)
17859 {
17860 if (player != this)
17861 {
17862 if (IsWithinDistInMap(player, radius))
17863 nearMembers.push_back(player);
17864 }
17865 else if (Unit* pet = GetGuardianPet())
17866 {
17867 if (IsWithinDistInMap(pet, radius))
17868 nearMembers.push_back(pet);
17869 }
17870 }
17871 else
17872 {
17873 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17874 if (Player* Target = itr->GetSource())
17875 {
17876 if (Target != this && !IsWithinDistInMap(Target, radius))
17877 continue;
17878
17879 // IsHostileTo check duel and controlled by enemy
17880 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17881 nearMembers.push_back(Target);
17882
17883 // Push player's pet to vector
17884 if (Unit* pet = Target->GetGuardianPet())
17885 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17886 nearMembers.push_back(pet);
17887 }
17888 }
17889
17890 if (!nearMembers.empty())
17891 {
17892 nearMembers.sort(Acore::HealthPctOrderPred());
17893 if (Unit* target = nearMembers.front())
17894 {
17895 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17896 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17897 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17898 aura->SetCharges(jumps);
17899 }
17900 }
17901 }
17902 }
17903 }
17904
17905 // heal
17906 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17907 return true;
17908}
@ SPELLFAMILY_PRIEST
Definition SharedDefines.h:3800
Definition Unit.h:2277

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6817{
6818 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6819 uint32 effIndex = triggeredByAura->GetEffIndex();
6820 int32 triggerAmount = triggeredByAura->GetAmount();
6821 Spell const* spellProc = eventInfo.GetProcSpell();
6822
6823 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
6824 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6825
6826 uint32 triggered_spell_id = 0;
6827 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6828 // otherwise, it's the triggered_spell_id by default
6829 Unit* target = victim;
6830 int32 basepoints0 = 0;
6831 ObjectGuid originalCaster;
6832
6833 switch (dummySpell->SpellFamilyName)
6834 {
6836 {
6837 switch (dummySpell->Id)
6838 {
6839 // Overkill
6840 case 58426:
6841 {
6842 triggered_spell_id = 58427;
6843 break;
6844 }
6845 // Unstable Power
6846 case 24658:
6847 {
6848 if (!procSpell || procSpell->Id == 24659)
6849 return false;
6850 // Need remove one 24659 aura
6851 RemoveAuraFromStack(24659);
6852 return true;
6853 }
6854 // Restless Strength
6855 case 24661:
6856 {
6857 // Need remove one 24662 aura
6858 RemoveAuraFromStack(24662);
6859 return true;
6860 }
6861 // Mark of Malice
6862 case 33493:
6863 {
6864 if (triggeredByAura->GetBase()->GetCharges() > 1)
6865 return true;
6866
6867 target = this;
6868 triggered_spell_id = 33494;
6869 break;
6870 }
6871 // Twisted Reflection (boss spell)
6872 case 21063:
6873 triggered_spell_id = 21064;
6874 break;
6875 // Vampiric Aura (boss spell)
6876 case 38196:
6877 {
6878 basepoints0 = 3 * damage; // 300%
6879 if (basepoints0 < 0)
6880 return false;
6881
6882 triggered_spell_id = 31285;
6883 target = this;
6884 break;
6885 }
6886 // Aura of Madness (Darkmoon Card: Madness trinket)
6887 //=====================================================
6888 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6889 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6890 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6891 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6892 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6893 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6894 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6895 // 41011 Martyr Complex: +35 stamina (All classes)
6896 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6897 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6898 case 39446:
6899 {
6900 if (!IsPlayer() || !IsAlive())
6901 return false;
6902
6903 // Select class defined buff
6904 switch (getClass())
6905 {
6906 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6907 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6908 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6909 cooldown_spell_id = 39511;
6910 break;
6911 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6912 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6913 case CLASS_DEATH_KNIGHT:
6914 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6915 cooldown_spell_id = 39511;
6916 break;
6917 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6918 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6919 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6920 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6921 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6922 cooldown_spell_id = 40999;
6923 break;
6924 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6925 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6926 cooldown_spell_id = 40997;
6927 break;
6928 default:
6929 return false;
6930 }
6931
6932 target = this;
6933 if (roll_chance_i(10))
6934 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6935 break;
6936 }
6937 // Sunwell Exalted Caster Neck (??? neck)
6938 // cast ??? Light's Wrath if Exalted by Aldor
6939 // cast ??? Arcane Bolt if Exalted by Scryers
6940 case 46569:
6941 return false; // old unused version
6942 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6943 // cast 45479 Light's Wrath if Exalted by Aldor
6944 // cast 45429 Arcane Bolt if Exalted by Scryers
6945 case 45481:
6946 {
6947 Player* player = ToPlayer();
6948 if (!player)
6949 return false;
6950
6951 // Get Aldor reputation rank
6952 if (player->GetReputationRank(932) == REP_EXALTED)
6953 {
6954 target = this;
6955 triggered_spell_id = 45479;
6956 break;
6957 }
6958 // Get Scryers reputation rank
6959 if (player->GetReputationRank(934) == REP_EXALTED)
6960 {
6961 // triggered at positive/self casts also, current attack target used then
6962 if (target && IsFriendlyTo(target))
6963 {
6964 target = GetVictim();
6965 if (!target)
6966 {
6967 target = player->GetSelectedUnit();
6968 if (!target)
6969 return false;
6970 }
6971 if (IsFriendlyTo(target))
6972 return false;
6973 }
6974
6975 triggered_spell_id = 45429;
6976 break;
6977 }
6978 return false;
6979 }
6980 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6981 // cast 45480 Light's Strength if Exalted by Aldor
6982 // cast 45428 Arcane Strike if Exalted by Scryers
6983 case 45482:
6984 {
6985 if (!IsPlayer())
6986 return false;
6987
6988 // Get Aldor reputation rank
6989 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6990 {
6991 target = this;
6992 triggered_spell_id = 45480;
6993 break;
6994 }
6995 // Get Scryers reputation rank
6996 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6997 {
6998 triggered_spell_id = 45428;
6999 break;
7000 }
7001 return false;
7002 }
7003 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
7004 // cast 45431 Arcane Insight if Exalted by Aldor
7005 // cast 45432 Light's Ward if Exalted by Scryers
7006 case 45483:
7007 {
7008 if (!IsPlayer())
7009 return false;
7010
7011 // Get Aldor reputation rank
7012 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
7013 {
7014 target = this;
7015 triggered_spell_id = 45432;
7016 break;
7017 }
7018 // Get Scryers reputation rank
7019 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
7020 {
7021 target = this;
7022 triggered_spell_id = 45431;
7023 break;
7024 }
7025 return false;
7026 }
7027 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
7028 // cast 45478 Light's Salvation if Exalted by Aldor
7029 // cast 45430 Arcane Surge if Exalted by Scryers
7030 case 45484:
7031 {
7032 if (!IsPlayer())
7033 return false;
7034
7035 // Get Aldor reputation rank
7036 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
7037 {
7038 target = this;
7039 triggered_spell_id = 45478;
7040 break;
7041 }
7042 // Get Scryers reputation rank
7043 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
7044 {
7045 triggered_spell_id = 45430;
7046 break;
7047 }
7048 return false;
7049 }
7050 // Kill command
7051 case 58914:
7052 {
7053 // Remove aura stack from pet
7054 RemoveAuraFromStack(58914);
7055 Unit* owner = GetOwner();
7056 if (!owner)
7057 return true;
7058 // reduce the owner's aura stack
7059 owner->RemoveAuraFromStack(34027);
7060 return true;
7061 }
7062 // Vampiric Touch (generic, used by some boss)
7063 case 52723:
7064 case 60501:
7065 {
7066 triggered_spell_id = 52724;
7067 basepoints0 = damage / 2;
7068 target = this;
7069 break;
7070 }
7071 // Divine purpose
7072 case 31871:
7073 case 31872:
7074 {
7075 // Roll chane
7076 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
7077 return false;
7078
7079 // Remove any stun effect on target
7081 return true;
7082 }
7083 // Glyph of Life Tap
7084 case 63320:
7085 {
7086 triggered_spell_id = 63321; // Life Tap
7087 break;
7088 }
7089 case 71519: // Deathbringer's Will Normal
7090 {
7091 if (!IsPlayer() || HasSpellCooldown(71484))
7092 return false;
7093
7094 AddSpellCooldown(71484, 0, cooldown);
7095
7096 std::vector<uint32> RandomSpells;
7097 switch (getClass())
7098 {
7099 case CLASS_WARRIOR:
7100 case CLASS_PALADIN:
7101 case CLASS_DEATH_KNIGHT:
7102 RandomSpells.push_back(71484);
7103 RandomSpells.push_back(71491);
7104 RandomSpells.push_back(71492);
7105 break;
7106 case CLASS_SHAMAN:
7107 case CLASS_ROGUE:
7108 RandomSpells.push_back(71486);
7109 RandomSpells.push_back(71485);
7110 RandomSpells.push_back(71492);
7111 break;
7112 case CLASS_DRUID:
7113 RandomSpells.push_back(71484);
7114 RandomSpells.push_back(71485);
7115 RandomSpells.push_back(71492);
7116 break;
7117 case CLASS_HUNTER:
7118 RandomSpells.push_back(71486);
7119 RandomSpells.push_back(71491);
7120 RandomSpells.push_back(71485);
7121 break;
7122 default:
7123 return false;
7124 }
7125 if (RandomSpells.empty()) // shouldn't happen
7126 return false;
7127
7128 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7129 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7130 break;
7131 }
7132 case 71562: // Deathbringer's Will Heroic
7133 {
7134 if (!IsPlayer() || HasSpellCooldown(71561))
7135 return false;
7136
7137 AddSpellCooldown(71561, 0, cooldown);
7138
7139 std::vector<uint32> RandomSpells;
7140 switch (getClass())
7141 {
7142 case CLASS_WARRIOR:
7143 case CLASS_PALADIN:
7144 case CLASS_DEATH_KNIGHT:
7145 RandomSpells.push_back(71561);
7146 RandomSpells.push_back(71559);
7147 RandomSpells.push_back(71560);
7148 break;
7149 case CLASS_SHAMAN:
7150 case CLASS_ROGUE:
7151 RandomSpells.push_back(71558);
7152 RandomSpells.push_back(71556);
7153 RandomSpells.push_back(71560);
7154 break;
7155 case CLASS_DRUID:
7156 RandomSpells.push_back(71561);
7157 RandomSpells.push_back(71556);
7158 RandomSpells.push_back(71560);
7159 break;
7160 case CLASS_HUNTER:
7161 RandomSpells.push_back(71558);
7162 RandomSpells.push_back(71559);
7163 RandomSpells.push_back(71556);
7164 break;
7165 default:
7166 return false;
7167 }
7168 if (RandomSpells.empty()) // shouldn't happen
7169 return false;
7170
7171 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7172 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7173 break;
7174 }
7175 // Freya, Petrified Bark
7176 case 62933:
7177 case 62337:
7178 {
7179 if (!victim)
7180 return false;
7181
7182 int32 dmg = damage;
7183 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
7184 return true;
7185 }
7186 // Trial of the Champion, Earth Shield
7187 case 67534:
7188 {
7189 const int32 dmg = (int32)damage;
7190 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
7191 return true;
7192 }
7193 // Trial of the Crusader, Faction Champions, Retaliation
7194 case 65932:
7195 {
7196 // check attack comes not from behind
7197 if (!victim || !HasInArc(M_PI, victim))
7198 return false;
7199
7200 triggered_spell_id = 65934;
7201 break;
7202 }
7203 // Pit of Saron, Tyrannus, Overlord's Brand
7204 case 69172: // everything except for DoTs
7205 {
7206 if (!target)
7207 return false;
7208 if (Unit* caster = triggeredByAura->GetCaster())
7209 {
7211 {
7212 int32 dmg = 5.5f * damage;
7213 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7214 }
7215 else
7216 {
7217 if (caster->GetVictim())
7218 {
7219 int32 dmg = damage;
7220 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7221 }
7222 }
7223 }
7224 return true;
7225 }
7226 // Pit of Saron, Tyrannus, Overlord's Brand
7227 case 69173: // only DoTs
7228 {
7229 if (!target)
7230 return false;
7231 if (Unit* caster = triggeredByAura->GetCaster())
7232 {
7233 if (procEx & PROC_EX_INTERNAL_HOT)
7234 {
7235 int32 dmg = 5.5f * damage;
7236 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7237 }
7238 else
7239 {
7240 if (caster->GetVictim())
7241 {
7242 int32 dmg = damage;
7243 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7244 }
7245 }
7246 }
7247 return true;
7248 }
7249 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
7250 case 70674:
7251 {
7252 if (Unit* caster = triggeredByAura->GetCaster())
7253 {
7254 int32 dmg = 3 * damage;
7255 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
7256 }
7257 return true;
7258 }
7259 // Item: Purified Shard of the Gods
7260 case 69755:
7261 {
7262 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
7263 break;
7264 }
7265 // Item: Shiny Shard of the Gods
7266 case 69739:
7267 {
7268 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
7269 break;
7270 }
7271 // VoA: Meteor Fists koralon
7272 case 66725:
7273 case 68161:
7274 {
7275 triggered_spell_id = 66765; // handled by spell_difficulty
7276 break;
7277 }
7278 }
7279 break;
7280 }
7281 case SPELLFAMILY_MAGE:
7282 {
7283 // Magic Absorption
7284 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
7285 {
7287 return false;
7288
7289 // mana reward
7290 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7291 target = this;
7292 triggered_spell_id = 29442;
7293 break;
7294 }
7295 // Hot Streak
7296 if (dummySpell->SpellIconID == 2999)
7297 {
7298 if (effIndex != 0)
7299 return false;
7300 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7301 if (!counter)
7302 return true;
7303
7304 // Count spell criticals in a row in second aura
7305 if (procEx & PROC_EX_CRITICAL_HIT)
7306 {
7307 counter->SetAmount(counter->GetAmount() * 2);
7308 if (counter->GetAmount() < 100) // not enough
7309 return true;
7310 // Crititcal counted -> roll chance
7311 if (roll_chance_i(triggerAmount))
7312 CastSpell(this, 48108, true, castItem, triggeredByAura);
7313 }
7314 counter->SetAmount(25);
7315 return true;
7316 }
7317 // Incanter's Regalia set (add trigger chance to Mana Shield)
7318 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7319 {
7320 if (!IsPlayer())
7321 return false;
7322
7323 target = this;
7324 triggered_spell_id = 37436;
7325 break;
7326 }
7327 switch (dummySpell->Id)
7328 {
7329 // Glyph of Polymorph
7330 case 56375:
7331 {
7332 if (!target)
7333 return false;
7334 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7337 return true;
7338 }
7339 // Glyph of Icy Veins
7340 case 56374:
7341 {
7344 return true;
7345 }
7346 // Glyph of Ice Block
7347 case 56372:
7348 {
7349 Player* player = ToPlayer();
7350 if (!player)
7351 return false;
7352
7353 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7354 // remove cooldowns on all ranks of Frost Nova
7355 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7356 {
7357 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7358 // Frost Nova
7359 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7360 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7361 player->RemoveSpellCooldown(cdSpell->Id, true);
7362 }
7363 break;
7364 }
7365 }
7366 break;
7367 }
7369 {
7370 // Second Wind
7371 if (dummySpell->SpellIconID == 1697)
7372 {
7373 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7374 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7375 return false;
7376 // Need stun or root mechanic
7377 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7378 return false;
7379
7380 switch (dummySpell->Id)
7381 {
7382 case 29838:
7383 triggered_spell_id = 29842;
7384 break;
7385 case 29834:
7386 triggered_spell_id = 29841;
7387 break;
7388 case 42770:
7389 triggered_spell_id = 42771;
7390 break;
7391 default:
7392 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7393 return false;
7394 }
7395
7396 target = this;
7397 break;
7398 }
7399 break;
7400 }
7402 {
7403 switch (dummySpell->Id)
7404 {
7405 // Nightfall
7406 case 18094:
7407 case 18095:
7408 // Glyph of corruption
7409 case 56218:
7410 {
7411 target = this;
7412 triggered_spell_id = 17941;
7413 break;
7414 }
7415 // Soul Leech
7416 case 30293:
7417 case 30295:
7418 case 30296:
7419 {
7420 // Improved Soul Leech
7421 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7422 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7423 {
7424 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7425 {
7426 if ((*i)->GetEffIndex() != 0)
7427 continue;
7428 basepoints0 = int32((*i)->GetAmount());
7429 target = GetGuardianPet();
7430 if (target)
7431 {
7432 // regen mana for pet
7433 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7434 }
7435 // regen mana for caster
7436 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7437 // Get second aura of spell for replenishment effect on party
7438 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7439 {
7440 // Replenishment - roll chance
7441 if (roll_chance_i(aurEff->GetAmount()))
7442 {
7443 CastSpell(this, 57669, true, castItem, triggeredByAura);
7444 }
7445 }
7446 break;
7447 }
7448 }
7449 // health
7450 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7451 target = this;
7452 triggered_spell_id = 30294;
7453 break;
7454 }
7455 // Shadowflame (Voidheart Raiment set bonus)
7456 case 37377:
7457 {
7458 triggered_spell_id = 37379;
7459 break;
7460 }
7461 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7462 case 37381:
7463 {
7464 target = GetGuardianPet();
7465 if (!target)
7466 return false;
7467
7468 // heal amount
7469 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7470 triggered_spell_id = 37382;
7471 break;
7472 }
7473 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7474 case 39437:
7475 {
7476 triggered_spell_id = 37378;
7477 break;
7478 }
7479 }
7480 break;
7481 }
7482 case SPELLFAMILY_PRIEST:
7483 {
7484 // Body and Soul
7485 if (dummySpell->SpellIconID == 2218)
7486 {
7487 // Proc only from Abolish desease on self cast
7488 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7489 return false;
7490 triggered_spell_id = 64136;
7491 target = this;
7492 break;
7493 }
7494 switch (dummySpell->Id)
7495 {
7496 // Vampiric Embrace
7497 case 15286:
7498 {
7499 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7500 return false;
7501
7502 // heal amount
7503 int32 total = CalculatePct(int32(damage), triggerAmount);
7504 int32 team = total / 5;
7505 int32 self = total - team;
7506 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7507 return true; // no hidden cooldown
7508 }
7509 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7510 case 40438:
7511 {
7512 // Shadow Word: Pain
7513 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7514 triggered_spell_id = 40441;
7515 // Renew
7516 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7517 triggered_spell_id = 40440;
7518 else
7519 return false;
7520
7521 target = this;
7522 break;
7523 }
7524 // Improved Shadowform
7525 case 47570:
7526 case 47569:
7527 {
7528 if (!roll_chance_i(triggerAmount))
7529 return false;
7530
7532 break;
7533 }
7534 // Glyph of Dispel Magic
7535 case 55677:
7536 {
7537 // Dispel Magic shares spellfamilyflag with abolish disease
7538 if (procSpell->SpellIconID != 74)
7539 return false;
7540 if (!target || !target->IsFriendlyTo(this))
7541 return false;
7542
7543 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7544 triggered_spell_id = 56131;
7545 break;
7546 }
7547 // Oracle Healing Bonus ("Garments of the Oracle" set)
7548 case 26169:
7549 {
7550 // heal amount
7551 basepoints0 = int32(CalculatePct(damage, 10));
7552 target = this;
7553 triggered_spell_id = 26170;
7554 break;
7555 }
7556 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7557 case 39372:
7558 {
7559 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7560 return false;
7561
7562 // heal amount
7563 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7564 target = this;
7565 triggered_spell_id = 39373;
7566 break;
7567 }
7568 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7569 case 28809:
7570 {
7571 triggered_spell_id = 28810;
7572 break;
7573 }
7574 // Priest T10 Healer 2P Bonus
7575 case 70770:
7576 // Flash Heal
7577 if (procSpell->SpellFamilyFlags[0] & 0x800)
7578 {
7579 triggered_spell_id = 70772;
7580 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7581 if (!blessHealing || !victim)
7582 return false;
7583 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7584 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7585 return true;
7586 }
7587 break;
7588 }
7589 break;
7590 }
7591 case SPELLFAMILY_DRUID:
7592 {
7593 switch (dummySpell->Id)
7594 {
7595 // Glyph of Innervate
7596 case 54832:
7597 {
7598 if (procSpell->SpellIconID != 62)
7599 return false;
7600
7601 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7602 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7603 triggered_spell_id = 54833;
7604 target = this;
7605 break;
7606 }
7607 // Glyph of Starfire
7608 case 54845:
7609 {
7610 triggered_spell_id = 54846;
7611 break;
7612 }
7613 // Glyph of Shred
7614 case 54815:
7615 {
7616 if (!target)
7617 return false;
7618
7619 // try to find spell Rip on the target
7620 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7621 {
7622 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7623 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7624
7625 // just Rip's max duration without other spells
7626 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7627
7628 // add possible auras' and Glyph of Shred's max duration
7629 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7630 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7631 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7632
7633 // if min < max -> that means caster didn't cast 3 shred yet
7634 // so set Rip's duration and max duration
7635 if (CountMin < CountMax)
7636 {
7637 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7638 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7639 return true;
7640 }
7641 }
7642 // if not found Rip
7643 return false;
7644 }
7645 // Glyph of Rake
7646 case 54821:
7647 {
7648 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7649 {
7650 if (target && target->IsCreature())
7651 {
7652 triggered_spell_id = 54820;
7653 break;
7654 }
7655 }
7656 return false;
7657 }
7658 // Leader of the Pack
7659 case 24932:
7660 {
7661 if (triggerAmount <= 0)
7662 return false;
7663 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7664 target = this;
7665 triggered_spell_id = 34299;
7666 if (triggeredByAura->GetCasterGUID() != GetGUID())
7667 break;
7668 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7669 // Improved Leader of the Pack
7670 // Check cooldown of heal spell cooldown
7671 if (IsPlayer() && !ToPlayer()->HasSpellCooldown(34299))
7672 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7673 break;
7674 }
7675 // Healing Touch (Dreamwalker Raiment set)
7676 case 28719:
7677 {
7678 // mana back
7679 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7680 target = this;
7681 triggered_spell_id = 28742;
7682 break;
7683 }
7684 // Glyph of Rejuvenation
7685 case 54754:
7686 {
7687 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7688 return false;
7689 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7690 triggered_spell_id = 54755;
7691 break;
7692 }
7693 // Healing Touch Refund (Idol of Longevity trinket)
7694 case 28847:
7695 {
7696 target = this;
7697 triggered_spell_id = 28848;
7698 break;
7699 }
7700 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7701 case 37288:
7702 case 37295:
7703 {
7704 target = this;
7705 triggered_spell_id = 37238;
7706 break;
7707 }
7708 // Druid Tier 6 Trinket
7709 case 40442:
7710 {
7711 float chance;
7712
7713 // Starfire
7714 if (procSpell->SpellFamilyFlags[0] & 0x4)
7715 {
7716 triggered_spell_id = 40445;
7717 chance = 25.0f;
7718 }
7719 // Rejuvenation
7720 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7721 {
7722 triggered_spell_id = 40446;
7723 chance = 25.0f;
7724 }
7725 // Mangle (Bear) and Mangle (Cat)
7726 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7727 {
7728 triggered_spell_id = 40452;
7729 chance = 40.0f;
7730 }
7731 else
7732 return false;
7733
7734 if (!roll_chance_f(chance))
7735 return false;
7736
7737 target = this;
7738 break;
7739 }
7740 // Maim Interrupt
7741 case 44835:
7742 {
7743 // Deadly Interrupt Effect
7744 triggered_spell_id = 32747;
7745 break;
7746 }
7747 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7748 case 70664:
7749 {
7750 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7751 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7752 return false;
7753
7754 Player* caster = ToPlayer();
7755 if (!caster)
7756 return false;
7757 if (!caster->GetGroup() && victim == this)
7758 return false;
7759
7760 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7761 return true;
7762 }
7763 }
7764 // Eclipse
7765 if (dummySpell->SpellIconID == 2856 && IsPlayer())
7766 {
7767 if (!procSpell || effIndex != 0)
7768 return false;
7769
7770 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7771
7772 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7773 return false;
7774
7775 target = this;
7776 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7777 return false;
7778
7779 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7780 break;
7781 }
7782 [[fallthrough]];
7783 }
7784 case SPELLFAMILY_ROGUE:
7785 {
7786 switch (dummySpell->Id)
7787 {
7788 // Glyph of Backstab
7789 case 56800:
7790 {
7791 if (victim)
7792 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7793 if (Aura* aur = aurEff->GetBase())
7794 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7795 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000))
7796 {
7797 aur->SetDuration(aur->GetDuration() + 2000);
7798 return true;
7799 }
7800 return false;
7801 }
7802 // Deadly Throw Interrupt
7803 case 32748:
7804 {
7805 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7806 if (this == victim)
7807 return false;
7808
7809 triggered_spell_id = 32747;
7810 break;
7811 }
7812 }
7813 // Master of subtlety
7814 if (dummySpell->SpellIconID == 2114)
7815 {
7816 triggered_spell_id = 31665;
7817 basepoints0 = triggerAmount;
7818 break;
7819 }
7820 // Cut to the Chase
7821 if (dummySpell->SpellIconID == 2909)
7822 {
7823 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7824 // lookup Slice and Dice
7825 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7826 {
7827 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7828 return true;
7829 }
7830 return false;
7831 }
7832 // Deadly Brew
7833 else if (dummySpell->SpellIconID == 2963)
7834 {
7835 triggered_spell_id = 3409;
7836 break;
7837 }
7838 // Quick Recovery
7839 else if (dummySpell->SpellIconID == 2116)
7840 {
7841 if (!procSpell)
7842 return false;
7843
7844 // energy cost save
7845 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7846 if (basepoints0 <= 0)
7847 return false;
7848
7849 target = this;
7850 triggered_spell_id = 31663;
7851 break;
7852 }
7853 break;
7854 }
7855 case SPELLFAMILY_HUNTER:
7856 {
7857 switch (dummySpell->SpellIconID)
7858 {
7859 case 2236: // Thrill of the Hunt
7860 {
7861 if (!procSpell)
7862 return false;
7863
7865
7866 // Disable charge drop because of Lock and Load
7867 if (spell)
7868 ToPlayer()->SetSpellModTakingSpell(spell, false);
7869
7870 // Explosive Shot
7871 if (procSpell->SpellFamilyFlags[2] & 0x200)
7872 {
7873 if (!victim)
7874 return false;
7875 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7876 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7877 }
7878 else
7879 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7880
7881 if (spell)
7882 ToPlayer()->SetSpellModTakingSpell(spell, true);
7883
7884 if (basepoints0 <= 0)
7885 return false;
7886
7887 target = this;
7888 triggered_spell_id = 34720;
7889 break;
7890 }
7891 case 3406: // Hunting Party
7892 {
7893 triggered_spell_id = 57669;
7894 target = this;
7895 break;
7896 }
7897 case 3560: // Rapid Recuperation
7898 {
7899 // This effect only from Rapid Killing (mana regen)
7900 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7901 return false;
7902
7903 target = this;
7904
7905 switch (dummySpell->Id)
7906 {
7907 case 53228: // Rank 1
7908 triggered_spell_id = 56654;
7909 break;
7910 case 53232: // Rank 2
7911 triggered_spell_id = 58882;
7912 break;
7913 }
7914 break;
7915 }
7916 }
7917
7918 switch (dummySpell->Id)
7919 {
7920 case 57870: // Glyph of Mend Pet
7921 {
7922 if (!victim)
7923 return false;
7924
7925 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7926 return true;
7927 }
7928 }
7929 break;
7930 }
7932 {
7933 // Light's Beacon - Beacon of Light
7934 if (dummySpell->Id == 53651)
7935 {
7936 if (!victim)
7937 return false;
7938
7939 // Do not proc from Glyph of Holy Light and Judgement of Light
7940 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7941 {
7942 return false;
7943 }
7944
7945 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7946 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7947 return false;
7948
7949 basepoints0 = int32(damage);
7950 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7951
7952 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7953 return true;
7954 }
7955 // Judgements of the Wise
7956 if (dummySpell->SpellIconID == 3017)
7957 {
7958 target = this;
7959 triggered_spell_id = 31930;
7960 // replenishment
7961 CastSpell(this, 57669, true, castItem, triggeredByAura);
7962 break;
7963 }
7964 // Righteous Vengeance
7965 if (dummySpell->SpellIconID == 3025)
7966 {
7967 if (!victim)
7968 return false;
7969
7970 // 4 damage tick
7971 basepoints0 = triggerAmount * damage / 400;
7972 triggered_spell_id = 61840;
7973 // Add remaining ticks to damage done
7974 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7975 return true;
7976 }
7977 // Sheath of Light
7978 if (dummySpell->SpellIconID == 3030)
7979 {
7980 // 4 healing tick
7981 basepoints0 = triggerAmount * damage / 400;
7982 triggered_spell_id = 54203;
7983 break;
7984 }
7985 switch (dummySpell->Id)
7986 {
7987 // Judgement of Light
7988 case 20185:
7989 {
7990 if (!victim || !victim->IsAlive())
7991 return false;
7992
7993 auto* caster = triggeredByAura->GetBase()->GetCaster();
7994 if (!caster || !victim->IsFriendlyTo(caster))
7995 return false;
7996
7997 // 2% of base health
7998 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
7999 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
8000 return true;
8001 }
8002 // Judgement of Wisdom
8003 case 20186:
8004 {
8005 if (!victim || !victim->IsAlive() || !victim->HasActivePowerType(POWER_MANA))
8006 return false;
8007
8008 auto* caster = triggeredByAura->GetBase()->GetCaster();
8009 if (!caster || !victim->IsFriendlyTo(caster))
8010 return false;
8011
8012 // 2% of base mana
8013 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
8014 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
8015 return true;
8016 }
8017 // Holy Power (Redemption Armor set)
8018 case 28789:
8019 {
8020 if (!victim)
8021 return false;
8022
8023 // Set class defined buff
8024 switch (victim->getClass())
8025 {
8026 case CLASS_PALADIN:
8027 case CLASS_PRIEST:
8028 case CLASS_SHAMAN:
8029 case CLASS_DRUID:
8030 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8031 break;
8032 case CLASS_MAGE:
8033 case CLASS_WARLOCK:
8034 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8035 break;
8036 case CLASS_HUNTER:
8037 case CLASS_ROGUE:
8038 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
8039 break;
8040 case CLASS_WARRIOR:
8041 triggered_spell_id = 28790; // Increases the friendly target's armor
8042 break;
8043 default:
8044 return false;
8045 }
8046 break;
8047 }
8048 // Seal of Vengeance (damage calc on apply aura)
8049 case 31801:
8050 {
8051 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
8052 return false;
8053
8054 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
8055 bool stacker = !procSpell || procSpell->Id == 53595;
8056 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
8057 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
8058
8059 if (!stacker && !damager)
8060 return false;
8061
8062 triggered_spell_id = 31803;
8063
8064 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
8065 {
8066 if (aur->GetStackAmount() == 5)
8067 {
8068 if (stacker)
8069 aur->RefreshDuration();
8070 }
8071 }
8072
8073 CastSpell(victim, 42463, true, castItem, triggeredByAura); // Seal of Vengeance
8074
8075 if (!stacker)
8076 return false;
8077 break;
8078 }
8079 // Seal of Corruption
8080 case 53736:
8081 {
8082 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
8083 return false;
8084
8085 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
8086 bool stacker = !procSpell || procSpell->Id == 53595;
8087 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
8088 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
8089
8090 if (!stacker && !damager)
8091 return false;
8092
8093 triggered_spell_id = 53742;
8094
8095 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
8096 {
8097 if (aur->GetStackAmount() == 5)
8098 {
8099 if (stacker)
8100 aur->RefreshDuration();
8101 }
8102 }
8103
8104 CastSpell(victim, 53739, true, castItem, triggeredByAura); // Seal of Corruption
8105
8106 if (!stacker)
8107 return false;
8108 break;
8109 }
8110 // Spiritual Attunement
8111 case 31785:
8112 case 33776:
8113 {
8114 // if healed by another unit (victim)
8115 if (this == victim)
8116 return false;
8117
8118 // dont allow non-positive dots to proc
8119 if (!procSpell || !procSpell->IsPositive())
8120 return false;
8121
8122 HealInfo const* healInfo = eventInfo.GetHealInfo();
8123 if (!healInfo)
8124 {
8125 return false;
8126 }
8127
8128 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
8129 if (effectiveHeal)
8130 {
8131 // heal amount
8132 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
8133 target = this;
8134
8135 if (basepoints0)
8136 triggered_spell_id = 31786;
8137 }
8138 break;
8139 }
8140 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
8141 case 40470:
8142 {
8143 if (!procSpell)
8144 return false;
8145
8146 float chance = 0.0f;
8147
8148 // Flash of light/Holy light
8149 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
8150 {
8151 triggered_spell_id = 40471;
8152 chance = 15.0f;
8153 }
8154 // Judgement (any)
8155 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
8156 {
8157 triggered_spell_id = 40472;
8158 chance = 50.0f;
8159 }
8160 else
8161 return false;
8162
8163 if (!roll_chance_f(chance))
8164 return false;
8165
8166 break;
8167 }
8168 // Glyph of Holy Light
8169 case 54937:
8170 {
8171 triggered_spell_id = 54968;
8172 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8173 break;
8174 }
8175 // Item - Paladin T8 Holy 2P Bonus
8176 case 64890:
8177 {
8178 triggered_spell_id = 64891;
8179 basepoints0 = triggerAmount * damage / 300;
8180 break;
8181 }
8182 case 71406: // Tiny Abomination in a Jar
8183 case 71545: // Tiny Abomination in a Jar (Heroic)
8184 {
8185 if (!victim || !victim->IsAlive())
8186 return false;
8187
8188 CastSpell(this, 71432, true, nullptr, triggeredByAura);
8189
8190 Aura const* dummy = GetAura(71432);
8191 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
8192 return false;
8193
8194 RemoveAurasDueToSpell(71432);
8195 triggered_spell_id = 71433; // default main hand attack
8196 // roll if offhand
8197 if (Player const* player = ToPlayer())
8198 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
8199 triggered_spell_id = 71434;
8200 target = victim;
8201 break;
8202 }
8203 // Item - Icecrown 25 Normal Dagger Proc
8204 case 71880:
8205 {
8206 switch (getPowerType())
8207 {
8208 case POWER_MANA:
8209 triggered_spell_id = 71881;
8210 break;
8211 case POWER_RAGE:
8212 triggered_spell_id = 71883;
8213 break;
8214 case POWER_ENERGY:
8215 triggered_spell_id = 71882;
8216 break;
8217 case POWER_RUNIC_POWER:
8218 triggered_spell_id = 71884;
8219 break;
8220 default:
8221 return false;
8222 }
8223 break;
8224 }
8225 // Item - Icecrown 25 Heroic Dagger Proc
8226 case 71892:
8227 {
8228 switch (getPowerType())
8229 {
8230 case POWER_MANA:
8231 triggered_spell_id = 71888;
8232 break;
8233 case POWER_RAGE:
8234 triggered_spell_id = 71886;
8235 break;
8236 case POWER_ENERGY:
8237 triggered_spell_id = 71887;
8238 break;
8239 case POWER_RUNIC_POWER:
8240 triggered_spell_id = 71885;
8241 break;
8242 default:
8243 return false;
8244 }
8245 break;
8246 }
8247 }
8248 break;
8249 }
8250 case SPELLFAMILY_SHAMAN:
8251 {
8252 switch (dummySpell->Id)
8253 {
8254 // Tidal Force
8255 case 55198:
8256 {
8257 // Remove aura stack from caster
8258 RemoveAuraFromStack(55166);
8259 // drop charges
8260 return false;
8261 }
8262 // Totemic Power (The Earthshatterer set)
8263 case 28823:
8264 {
8265 if (!victim)
8266 return false;
8267
8268 // Set class defined buff
8269 switch (victim->getClass())
8270 {
8271 case CLASS_PALADIN:
8272 case CLASS_PRIEST:
8273 case CLASS_SHAMAN:
8274 case CLASS_DRUID:
8275 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8276 break;
8277 case CLASS_MAGE:
8278 case CLASS_WARLOCK:
8279 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8280 break;
8281 case CLASS_HUNTER:
8282 case CLASS_ROGUE:
8283 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8284 break;
8285 case CLASS_WARRIOR:
8286 triggered_spell_id = 28827; // Increases the friendly target's armor
8287 break;
8288 default:
8289 return false;
8290 }
8291 break;
8292 }
8293 // Lesser Healing Wave (Totem of Flowing Water Relic)
8294 case 28849:
8295 {
8296 target = this;
8297 triggered_spell_id = 28850;
8298 break;
8299 }
8300 // Windfury Weapon (Passive) 1-8 Ranks
8301 case 33757:
8302 {
8303 Player* player = ToPlayer();
8304 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8305 return false;
8306
8307 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8308 return false;
8309
8310 WeaponAttackType attType = player->GetAttackBySlot(castItem->GetSlot());
8311 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8312 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8313 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8314 return false;
8315
8316 // Now amount of extra power stored in 1 effect of Enchant spell
8317 // Get it by item enchant id
8318 uint32 spellId;
8320 {
8321 case 283:
8322 spellId = 8232;
8323 break; // 1 Rank
8324 case 284:
8325 spellId = 8235;
8326 break; // 2 Rank
8327 case 525:
8328 spellId = 10486;
8329 break; // 3 Rank
8330 case 1669:
8331 spellId = 16362;
8332 break; // 4 Rank
8333 case 2636:
8334 spellId = 25505;
8335 break; // 5 Rank
8336 case 3785:
8337 spellId = 58801;
8338 break; // 6 Rank
8339 case 3786:
8340 spellId = 58803;
8341 break; // 7 Rank
8342 case 3787:
8343 spellId = 58804;
8344 break; // 8 Rank
8345 default:
8346 {
8347 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8348 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8349 return false;
8350 }
8351 }
8352
8353 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8354 if (!windfurySpellInfo)
8355 {
8356 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8357 return false;
8358 }
8359
8360 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8361
8362 // Value gained from additional AP
8363 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8364
8365 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8366 triggered_spell_id = 25504;
8367
8368 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8369 triggered_spell_id = 33750;
8370
8371 // custom cooldown processing case
8372 if (player->HasSpellCooldown(dummySpell->Id))
8373 return false;
8374
8375 // apply cooldown before cast to prevent processing itself
8376 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8377
8378 // Attack Twice
8379 for (uint32 i = 0; i < 2; ++i)
8380 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8381
8382 return true;
8383 }
8384 // Shaman Tier 6 Trinket
8385 case 40463:
8386 {
8387 if (!procSpell)
8388 return false;
8389
8390 float chance;
8391 if (procSpell->SpellFamilyFlags[0] & 0x1)
8392 {
8393 triggered_spell_id = 40465; // Lightning Bolt
8394 chance = 15.0f;
8395 }
8396 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8397 {
8398 triggered_spell_id = 40465; // Lesser Healing Wave
8399 chance = 10.0f;
8400 }
8401 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8402 {
8403 triggered_spell_id = 40466; // Stormstrike
8404 chance = 50.0f;
8405 }
8406 else
8407 return false;
8408
8409 if (!roll_chance_f(chance))
8410 return false;
8411
8412 target = this;
8413 break;
8414 }
8415 // Glyph of Healing Wave
8416 case 55440:
8417 {
8418 // Not proc from self heals
8419 if (this == victim)
8420 return false;
8421 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8422 target = this;
8423 triggered_spell_id = 55533;
8424 break;
8425 }
8426 // Spirit Hunt
8427 case 58877:
8428 {
8429 // Cast on owner
8430 target = GetOwner();
8431 if (!target)
8432 return false;
8433 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8434 triggered_spell_id = 58879;
8435 // Heal wolf
8436 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8437 break;
8438 }
8439 // Shaman T9 Elemental 4P Bonus
8440 case 67228:
8441 {
8442 // Lava Burst
8443 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8444 {
8445 triggered_spell_id = 71824;
8446 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8447 if (!triggeredSpell)
8448 return false;
8449 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8450 }
8451 break;
8452 }
8453 // Item - Shaman T10 Elemental 4P Bonus
8454 case 70817:
8455 {
8456 if (!target)
8457 return false;
8458 // try to find spell Flame Shock on the target
8459 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8460 {
8461 Aura* flameShock = aurEff->GetBase();
8462 int32 extraTime = 2 * aurEff->GetAmplitude();
8463 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8464 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8465
8466 return true;
8467 }
8468 // if not found Flame Shock
8469 return false;
8470 }
8471 break;
8472 }
8473 // Frozen Power
8474 if (dummySpell->SpellIconID == 3780)
8475 {
8476 if (!target)
8477 return false;
8478 if (GetDistance(target) < 15.0f)
8479 return false;
8480 float chance = (float)triggerAmount;
8481 if (!roll_chance_f(chance))
8482 return false;
8483
8484 triggered_spell_id = 63685;
8485 break;
8486 }
8487 // Ancestral Awakening
8488 if (dummySpell->SpellIconID == 3065)
8489 {
8490 triggered_spell_id = 52759;
8491 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8492 target = this;
8493 break;
8494 }
8495 // Flametongue Weapon (Passive)
8496 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8497 {
8498 if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8499 return false;
8500
8501 WeaponAttackType attType = Player::GetAttackBySlot(castItem->GetSlot());
8502 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8503 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8504 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8505 return false;
8506
8507 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8508
8509 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8511
8512 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8513 ApplyPct(add_spellpower, 3.84f);
8514
8515 // Enchant on Off-Hand and ready?
8516 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8517 {
8518 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8519
8520 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8521 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8522 triggered_spell_id = 10444;
8523 }
8524
8525 // Enchant on Main-Hand and ready?
8526 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8527 {
8528 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8529
8530 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8531 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8532 triggered_spell_id = 10444;
8533 }
8534
8535 // If not ready, we should return, shouldn't we?!
8536 else
8537 return false;
8538
8539 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8540 return true;
8541 }
8542 // Improved Water Shield
8543 if (dummySpell->SpellIconID == 2287)
8544 {
8545 if (!procSpell)
8546 return false;
8547
8548 // Default chance for Healing Wave and Riptide
8549 float chance = (float)triggeredByAura->GetAmount();
8550
8551 if (procSpell->SpellFamilyFlags[0] & 0x80)
8552 // Lesser Healing Wave - 0.6 of default
8553 chance *= 0.6f;
8554 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8555 // Chain heal - 0.3 of default
8556 chance *= 0.3f;
8557
8558 if (!roll_chance_f(chance))
8559 return false;
8560
8561 // Water Shield
8562 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8563 {
8564 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8565 CastSpell(this, spell, true, castItem, triggeredByAura);
8566 return true;
8567 }
8568 return false;
8569 }
8570 // Lightning Overload
8571 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8572 {
8573 if (!procSpell || !IsPlayer() || !victim)
8574 return false;
8575
8576 uint32 spell = 45284;
8577
8578 // chain lightning only procs 1/3 of the time
8579 if (procSpell->SpellFamilyFlags[0] & 0x2)
8580 {
8581 if (!roll_chance_i(33))
8582 return false;
8583 spell = 45297;
8584 }
8585
8586 if (procEx & PROC_EX_CRITICAL_HIT)
8587 damage /= 2;
8588
8589 // do not reduce damage-spells have correct basepoints
8590 damage /= 2;
8591 int32 dmg = damage;
8592
8593 // Cast
8594 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8595 return true;
8596 }
8597 // Static Shock
8598 if (dummySpell->SpellIconID == 3059)
8599 {
8600 // Lightning Shield
8602 {
8603 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8604 CastSpell(target, spell, true, castItem, triggeredByAura);
8605 aurEff->GetBase()->DropCharge();
8606 return true;
8607 }
8608 return false;
8609 }
8610 break;
8611 }
8613 {
8614 // Improved Blood Presence
8615 if (dummySpell->SpellIconID == 2636)
8616 {
8617 if (!IsPlayer())
8618 return false;
8619 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8620 break;
8621 }
8622 // Butchery
8623 if (dummySpell->SpellIconID == 2664)
8624 {
8625 basepoints0 = triggerAmount;
8626 triggered_spell_id = 50163;
8627 target = this;
8628 break;
8629 }
8630 // Mark of Blood
8631 if (dummySpell->Id == 49005)
8632 {
8634 triggered_spell_id = 61607;
8635 break;
8636 }
8637 // Unholy Blight
8638 if (dummySpell->Id == 49194)
8639 {
8640 triggered_spell_id = 50536;
8641 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8642 if (!unholyBlight || !victim)
8643 return false;
8644
8645 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8646
8647 //Glyph of Unholy Blight
8648 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8649 AddPct(basepoints0, glyph->GetAmount());
8650
8651 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8652 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8653 return true;
8654 }
8655 // Vendetta
8656 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8657 {
8658 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8659 triggered_spell_id = 50181;
8660 target = this;
8661 break;
8662 }
8663 // Necrosis
8664 if (dummySpell->SpellIconID == 2709)
8665 {
8666 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8667 triggered_spell_id = 51460;
8668 break;
8669 }
8670 // Threat of Thassarian
8671 if (dummySpell->SpellIconID == 2023)
8672 {
8673 // Must Dual Wield
8674 if (!procSpell || !HasOffhandWeaponForAttack())
8675 return false;
8676 // Chance as basepoints for dummy aura
8677 if (!roll_chance_i(triggerAmount))
8678 return false;
8679
8680 switch (procSpell->Id)
8681 {
8682 // Obliterate
8683 case 49020:
8684 triggered_spell_id = 66198;
8685 break; // Rank 1
8686 case 51423:
8687 triggered_spell_id = 66972;
8688 break; // Rank 2
8689 case 51424:
8690 triggered_spell_id = 66973;
8691 break; // Rank 3
8692 case 51425:
8693 triggered_spell_id = 66974;
8694 break; // Rank 4
8695
8696 // Frost Strike
8697 case 49143:
8698 triggered_spell_id = 66196;
8699 break; // Rank 1
8700 case 51416:
8701 triggered_spell_id = 66958;
8702 break; // Rank 2
8703 case 51417:
8704 triggered_spell_id = 66959;
8705 break; // Rank 3
8706 case 51418:
8707 triggered_spell_id = 66960;
8708 break; // Rank 4
8709 case 51419:
8710 triggered_spell_id = 66961;
8711 break; // Rank 5
8712 case 55268:
8713 triggered_spell_id = 66962;
8714 break; // Rank 6
8715
8716 // Plague Strike
8717 case 45462:
8718 triggered_spell_id = 66216;
8719 break; // Rank 1
8720 case 49917:
8721 triggered_spell_id = 66988;
8722 break; // Rank 2
8723 case 49918:
8724 triggered_spell_id = 66989;
8725 break; // Rank 3
8726 case 49919:
8727 triggered_spell_id = 66990;
8728 break; // Rank 4
8729 case 49920:
8730 triggered_spell_id = 66991;
8731 break; // Rank 5
8732 case 49921:
8733 triggered_spell_id = 66992;
8734 break; // Rank 6
8735
8736 // Death Strike
8737 case 49998:
8738 triggered_spell_id = 66188;
8739 break; // Rank 1
8740 case 49999:
8741 triggered_spell_id = 66950;
8742 break; // Rank 2
8743 case 45463:
8744 triggered_spell_id = 66951;
8745 break; // Rank 3
8746 case 49923:
8747 triggered_spell_id = 66952;
8748 break; // Rank 4
8749 case 49924:
8750 triggered_spell_id = 66953;
8751 break; // Rank 5
8752
8753 // Rune Strike
8754 case 56815:
8755 triggered_spell_id = 66217;
8756 break; // Rank 1
8757
8758 // Blood Strike
8759 case 45902:
8760 triggered_spell_id = 66215;
8761 break; // Rank 1
8762 case 49926:
8763 triggered_spell_id = 66975;
8764 break; // Rank 2
8765 case 49927:
8766 triggered_spell_id = 66976;
8767 break; // Rank 3
8768 case 49928:
8769 triggered_spell_id = 66977;
8770 break; // Rank 4
8771 case 49929:
8772 triggered_spell_id = 66978;
8773 break; // Rank 5
8774 case 49930:
8775 triggered_spell_id = 66979;
8776 break; // Rank 6
8777 default:
8778 return false;
8779 }
8780
8781 // This should do, restore spell mod so next attack can also use this!
8782 // crit chance for first strike is already computed
8783 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8784 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8785
8786 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8787 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8788 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8789 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8790
8791 SetCantProc(true);
8792 if (basepoints0)
8793 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8794 else
8795 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8796 SetCantProc(false);
8797 return true;
8798 }
8799 // Runic Power Back on Snare/Root
8800 if (dummySpell->Id == 61257)
8801 {
8802 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8803 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8804 return false;
8805 // Need snare or root mechanic
8806 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8807 return false;
8808 triggered_spell_id = 61258;
8809 target = this;
8810 break;
8811 }
8812 // Sudden Doom
8813 if (dummySpell->SpellIconID == 1939 && IsPlayer())
8814 {
8815 SpellChainNode const* chain = nullptr;
8816 // get highest rank of the Death Coil spell
8817 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8818 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8819 {
8820 // check if shown in spell book
8821 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8822 continue;
8823
8824 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8825 if (!spellProto)
8826 continue;
8827
8828 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8829 && spellProto->SpellFamilyFlags[0] & 0x2000)
8830 {
8831 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8832
8833 // No chain entry or entry lower than found entry
8834 if (!chain || !newChain || (chain->rank < newChain->rank))
8835 {
8836 triggered_spell_id = itr->first;
8837 chain = newChain;
8838 }
8839 else
8840 continue;
8841 // Found spell is last in chain - do not need to look more
8842 // Optimisation for most common case
8843 if (chain && chain->last->Id == itr->first)
8844 break;
8845 }
8846 }
8847 }
8848 break;
8849 }
8850 case SPELLFAMILY_POTION:
8851 {
8852 // alchemist's stone
8853 if (dummySpell->Id == 17619)
8854 {
8855 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8856 {
8857 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8858 {
8859 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8860 {
8861 triggered_spell_id = 21399;
8862 }
8863 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8864 {
8865 triggered_spell_id = 21400;
8866 }
8867 else
8868 continue;
8869
8870 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8871 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8872 }
8873 return true;
8874 }
8875 }
8876 break;
8877 }
8878 case SPELLFAMILY_PET:
8879 {
8880 switch (dummySpell->SpellIconID)
8881 {
8882 // Guard Dog
8883 case 201:
8884 {
8885 if (!victim)
8886 return false;
8887
8888 triggered_spell_id = 54445;
8889 target = this;
8890 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8891 victim->AddThreat(this, addThreat);
8892 break;
8893 }
8894 // Silverback
8895 case 1582:
8896 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8897 target = this;
8898 break;
8899 }
8900 break;
8901 }
8902 default:
8903 break;
8904 }
8905
8906 // if not handled by custom case, get triggered spell from dummySpell proto
8907 if (!triggered_spell_id)
8908 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8909
8910 // processed charge only counting case
8911 if (!triggered_spell_id)
8912 return true;
8913
8914 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8915 if (!triggerEntry)
8916 {
8917 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8918 return false;
8919 }
8920
8921 if (cooldown_spell_id == 0)
8922 cooldown_spell_id = triggered_spell_id;
8923
8924 if (cooldown)
8925 {
8926 if (HasSpellCooldown(cooldown_spell_id))
8927 return false;
8928
8929 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8930 }
8931
8932 if (basepoints0)
8933 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8934 else
8935 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8936
8937 return true;
8938}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition CreatureAIImpl.h:25
EnchantmentSlot
Definition Item.h:168
@ TEMP_ENCHANTMENT_SLOT
Definition Item.h:170
std::map< uint32, SpellCooldown > SpellCooldowns
Definition Player.h:210
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition Player.h:195
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:685
@ PLAYERSPELL_REMOVED
Definition Player.h:123
int32 irand(int32 min, int32 max)
Definition Random.cpp:37
@ SPELL_EFFECT_ENERGIZE
Definition SharedDefines.h:819
@ LANG_UNIVERSAL
Definition SharedDefines.h:746
@ CLASS_DRUID
Definition SharedDefines.h:151
@ CLASS_SHAMAN
Definition SharedDefines.h:147
@ CLASS_PRIEST
Definition SharedDefines.h:145
@ CLASS_WARLOCK
Definition SharedDefines.h:149
@ CLASS_MAGE
Definition SharedDefines.h:148
@ CLASS_PALADIN
Definition SharedDefines.h:142
@ CLASS_ROGUE
Definition SharedDefines.h:144
@ MECHANIC_STUN
Definition SharedDefines.h:1348
@ MECHANIC_ROOT
Definition SharedDefines.h:1343
@ MECHANIC_SNARE
Definition SharedDefines.h:1347
@ SPELLFAMILY_WARLOCK
Definition SharedDefines.h:3799
@ SPELLFAMILY_PALADIN
Definition SharedDefines.h:3804
@ SPELLFAMILY_HUNTER
Definition SharedDefines.h:3803
@ SPELLFAMILY_POTION
Definition SharedDefines.h:3807
@ SPELLFAMILY_ROGUE
Definition SharedDefines.h:3802
@ SPELLFAMILY_DRUID
Definition SharedDefines.h:3801
@ SPELLFAMILY_PET
Definition SharedDefines.h:3811
@ REP_EXALTED
Definition SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition SharedDefines.h:313
@ SPELL_SCHOOL_MASK_FIRE
Definition SharedDefines.h:310
@ SPELL_SCHOOL_MASK_FROST
Definition SharedDefines.h:312
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition SpellAuraDefines.h:289
@ PROC_EX_INTERNAL_HOT
Definition SpellMgr.h:219
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition SpellMgr.h:127
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition SpellMgr.h:121
WeaponAttackType
Definition Unit.h:215
T ApplyPct(T &base, U pct)
Definition Util.h:64
Definition Unit.h:380
uint32 GetEffectiveHeal() const
Definition Unit.h:420
uint8 GetSlot() const
Definition Item.h:281
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition Item.h:304
bool IsEquipped() const
Definition Item.cpp:789
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition Player.cpp:10111
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition Player.cpp:9959
bool HasSpellCooldown(uint32 spell_id) const override
Definition Player.cpp:16355
PlayerSpellMap const & GetSpellMap() const
Definition Player.h:1768
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition Player.cpp:11111
SpellCooldowns GetSpellCooldowns() const
Definition Player.h:2166
ReputationRank GetReputationRank(uint32 faction_id) const
Definition Player.cpp:5932
Unit * GetSelectedUnit() const
Definition Player.cpp:11553
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition Player.cpp:3530
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:9428
Item * GetItemByGuid(ObjectGuid guid) const
Definition PlayerStorage.cpp:409
Spell * m_spellModTakingSpell
Definition Player.h:2568
static WeaponAttackType GetAttackBySlot(uint8 slot)
Definition PlayerStorage.cpp:544
uint32 ProcChance
Definition SpellInfo.h:356
SpellInfo const * GetSpellInfo() const
Definition Spell.h:587
int32 GetPowerCost() const
Definition Spell.h:588
uint32 GetCreatePowers(Powers power) const
Definition Unit.cpp:15881
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5700
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition Unit.cpp:5372
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition Unit.cpp:14956
void SetCantProc(bool apply)
Definition Unit.cpp:17530
bool HealthBelowPct(int32 pct) const
Definition Unit.h:1101
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5028
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition Unit.cpp:12170
bool IsFriendlyTo(Unit const *unit) const
Definition Unit.cpp:10420
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12136
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:1106
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition Unit.cpp:20281
Powers getPowerType() const
Definition Unit.h:1116
void RemoveMovementImpairingAuras(bool withRoot)
Definition Unit.cpp:5353
Definition SpellMgr.h:546
SpellInfo const * last
Definition SpellMgr.h:550
uint8 rank
Definition SpellMgr.h:551
SpellInfo const * first
Definition SpellMgr.h:549

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellChainNode::first, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), HasOffhandWeaponForAttack(), Player::HasSpellCooldown(), HasSpellCooldown(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Object::IsCreature(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
2037{
2039 packet.EmoteID = emoteId;
2040 packet.Guid = GetGUID();
2041 SendMessageToSet(packet.Write(), true);
2042}
Definition ChatPackets.h:29
WorldPacket const * Write() override
Definition ChatPackets.cpp:20
uint32 EmoteID
Definition ChatPackets.h:35
ObjectGuid Guid
Definition ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), spell_chapter5_return_to_capital::HandleHit(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_maiev_illidan::IsSummonedBy(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_felmyst::ScheduleGroundAbilities(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_harrison_jones::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
10041{
10042 int32 scriptId = triggeredByAura->GetMiscValue();
10043
10044 if (!victim || !victim->IsAlive())
10045 return false;
10046
10047 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
10048 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
10049
10050 uint32 triggered_spell_id = 0;
10051
10052 switch (scriptId)
10053 {
10054 case 836: // Improved Blizzard (Rank 1)
10055 {
10056 if (!procSpell || procSpell->SpellVisual[0] != 9487)
10057 return false;
10058 triggered_spell_id = 12484;
10059 break;
10060 }
10061 case 988: // Improved Blizzard (Rank 2)
10062 {
10063 if (!procSpell || procSpell->SpellVisual[0] != 9487)
10064 return false;
10065 triggered_spell_id = 12485;
10066 break;
10067 }
10068 case 989: // Improved Blizzard (Rank 3)
10069 {
10070 if (!procSpell || procSpell->SpellVisual[0] != 9487)
10071 return false;
10072 triggered_spell_id = 12486;
10073 break;
10074 }
10075 case 4533: // Dreamwalker Raiment 2 pieces bonus
10076 {
10077 // Chance 50%
10078 if (!roll_chance_i(50))
10079 return false;
10080
10081 switch (victim->getPowerType())
10082 {
10083 case POWER_MANA:
10084 triggered_spell_id = 28722;
10085 break;
10086 case POWER_RAGE:
10087 triggered_spell_id = 28723;
10088 break;
10089 case POWER_ENERGY:
10090 triggered_spell_id = 28724;
10091 break;
10092 default:
10093 return false;
10094 }
10095 break;
10096 }
10097 case 4537: // Dreamwalker Raiment 6 pieces bonus
10098 triggered_spell_id = 28750; // Blessing of the Claw
10099 break;
10100 case 5497: // Improved Mana Gems
10101 triggered_spell_id = 37445; // Mana Surge
10102 break;
10103 case 7010: // Revitalize - can proc on full hp target
10104 case 7011:
10105 case 7012:
10106 {
10107 if (!roll_chance_i(triggeredByAura->GetAmount()))
10108 return false;
10109 switch (victim->getPowerType())
10110 {
10111 case POWER_MANA:
10112 triggered_spell_id = 48542;
10113 break;
10114 case POWER_RAGE:
10115 triggered_spell_id = 48541;
10116 break;
10117 case POWER_ENERGY:
10118 triggered_spell_id = 48540;
10119 break;
10120 case POWER_RUNIC_POWER:
10121 triggered_spell_id = 48543;
10122 break;
10123 default:
10124 break;
10125 }
10126 break;
10127 }
10128 default:
10129 break;
10130 }
10131
10132 // not processed
10133 if (!triggered_spell_id)
10134 return false;
10135
10136 // standard non-dummy case
10137 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
10138
10139 if (!triggerEntry)
10140 {
10141 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
10142 return false;
10143 }
10144
10145 if (cooldown)
10146 {
10147 if (HasSpellCooldown(triggered_spell_id))
10148 return false;
10149
10150 AddSpellCooldown(triggered_spell_id, 0, cooldown);
10151 }
10152
10153 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
10154
10155 return true;
10156}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), HasSpellCooldown(), IsAlive(), Object::IsPlayer(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2797{
2798 while (count)
2799 {
2800 --count;
2801 AttackerStateUpdate(victim, BASE_ATTACK, true);
2802 }
2803}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition Unit.cpp:2601

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
9138{
9139 // Get triggered aura spell info
9140 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
9141
9142 // Basepoints of trigger aura
9143 int32 triggerAmount = triggeredByAura->GetAmount();
9144
9145 // Set trigger spell id, target, custom basepoints
9146 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
9147
9148 Unit* target = nullptr;
9149 int32 basepoints0 = 0;
9150
9151 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
9152 basepoints0 = triggerAmount;
9153
9154 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9155 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9156
9157 // Try handle unknown trigger spells
9158 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
9159 {
9160 switch (auraSpellInfo->SpellFamilyName)
9161 {
9163 switch (auraSpellInfo->Id)
9164 {
9165 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
9166 // Pct value stored in dummy
9167 if (!victim)
9168 return false;
9169 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
9170 target = victim;
9171 break;
9172 case 57345: // Darkmoon Card: Greatness
9173 {
9174 float stat = 0.0f;
9175 // strength
9176 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
9177 // agility
9178 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
9179 // intellect
9180 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
9181 // spirit
9182 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
9183 break;
9184 }
9185 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
9186 {
9187 if (!damage)
9188 return false;
9189 float stat = 0.0f;
9190 // strength
9191 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
9192 // agility
9193 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
9194 break;
9195 }
9196 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
9197 {
9198 if (!damage)
9199 return false;
9200 float stat = 0.0f;
9201 // strength
9202 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
9203 // agility
9204 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
9205 break;
9206 }
9207 case 27522: // Mana Drain Trigger
9208 case 40336: // Mana Drain Trigger
9209 case 46939: // Black Bow of the Betrayer
9210 {
9211 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
9212 if (IsAlive())
9213 CastSpell(this, 29471, true, castItem, triggeredByAura);
9214 if (victim && victim->IsAlive())
9215 CastSpell(victim, 27526, true, castItem, triggeredByAura);
9216 return true;
9217 }
9218 // Forge of Souls, Devourer of Souls, Mirrored Soul
9219 case 69023:
9220 {
9221 int32 dmg = damage * 0.45f;
9222 if (dmg > 0)
9223 if (Aura* a = GetAura(69023))
9224 if (Unit* c = a->GetCaster())
9225 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
9226 return true;
9227 }
9228 // Soul-Trader Beacon proc aura
9229 case 50051:
9230 {
9231 if (!victim)
9232 return false;
9233
9234 if (Creature* cr = GetCompanionPet())
9235 cr->CastSpell(victim, 50101, true);
9236
9237 return false;
9238 }
9239 }
9240 break;
9241 case SPELLFAMILY_MAGE:
9242 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
9243 {
9244 switch (auraSpellInfo->Id)
9245 {
9246 case 31641: // Rank 1
9247 case 31642: // Rank 2
9248 trigger_spell_id = 31643;
9249 break;
9250 default:
9251 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
9252 return false;
9253 }
9254 }
9255 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
9256 {
9257 Creature* creature = victim->ToCreature();
9258 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
9259 return false;
9260 }
9261 break;
9263 {
9264 // Nether Protection
9265 if (auraSpellInfo->SpellIconID == 1985)
9266 {
9267 if (!procSpell)
9268 return false;
9269 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9270 {
9272 return false; // ignore
9273 case SPELL_SCHOOL_HOLY:
9274 trigger_spell_id = 54370;
9275 break;
9276 case SPELL_SCHOOL_FIRE:
9277 trigger_spell_id = 54371;
9278 break;
9280 trigger_spell_id = 54375;
9281 break;
9282 case SPELL_SCHOOL_FROST:
9283 trigger_spell_id = 54372;
9284 break;
9286 trigger_spell_id = 54374;
9287 break;
9289 trigger_spell_id = 54373;
9290 break;
9291 default:
9292 return false;
9293 }
9294 }
9295 break;
9296 }
9297 case SPELLFAMILY_PRIEST:
9298 {
9299 // Blessed Recovery
9300 if (auraSpellInfo->SpellIconID == 1875)
9301 {
9302 switch (auraSpellInfo->Id)
9303 {
9304 case 27811:
9305 trigger_spell_id = 27813;
9306 break;
9307 case 27815:
9308 trigger_spell_id = 27817;
9309 break;
9310 case 27816:
9311 trigger_spell_id = 27818;
9312 break;
9313 default:
9314 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9315 return false;
9316 }
9317 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9318 target = this;
9319 // Add remaining ticks to healing done
9320 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9321 return true;
9322 }
9323 break;
9324 }
9325 case SPELLFAMILY_DRUID:
9326 {
9327 switch (auraSpellInfo->Id)
9328 {
9329 // Druid Forms Trinket
9330 case 37336:
9331 {
9332 switch (GetShapeshiftForm())
9333 {
9334 case FORM_NONE:
9335 trigger_spell_id = 37344;
9336 break;
9337 case FORM_CAT:
9338 trigger_spell_id = 37341;
9339 break;
9340 case FORM_BEAR:
9341 case FORM_DIREBEAR:
9342 trigger_spell_id = 37340;
9343 break;
9344 case FORM_TREE:
9345 trigger_spell_id = 37342;
9346 break;
9347 case FORM_MOONKIN:
9348 trigger_spell_id = 37343;
9349 break;
9350 default:
9351 return false;
9352 }
9353 break;
9354 }
9355 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9356 case 67353:
9357 {
9358 switch (GetShapeshiftForm())
9359 {
9360 case FORM_CAT:
9361 trigger_spell_id = 67355;
9362 break;
9363 case FORM_BEAR:
9364 case FORM_DIREBEAR:
9365 trigger_spell_id = 67354;
9366 break;
9367 default:
9368 return false;
9369 }
9370 break;
9371 }
9372 default:
9373 break;
9374 }
9375 break;
9376 }
9377 case SPELLFAMILY_HUNTER:
9378 {
9379 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9380 {
9381 if (!victim)
9382 return false;
9383
9384 switch (auraSpellInfo->Id)
9385 {
9386 case 53234: // Rank 1
9387 case 53237: // Rank 2
9388 case 53238: // Rank 3
9389 trigger_spell_id = 63468;
9390 break;
9391 default:
9392 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9393 return false;
9394 }
9395 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9396 if (!TriggerPS)
9397 return false;
9398
9399 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9400 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9401 return true;
9402 }
9403 // Item - Hunter T9 4P Bonus (Steady Shot)
9404 else if (auraSpellInfo->Id == 67151)
9405 {
9406 if (!IsPlayer() || !ToPlayer()->GetPet())
9407 return false;
9408
9409 target = ToPlayer()->GetPet();
9410 trigger_spell_id = 68130;
9411 break;
9412 }
9413 break;
9414 }
9416 {
9417 switch (auraSpellInfo->Id)
9418 {
9419 case 37657: // Lightning Capacitor
9420 case 54841: // Thunder Capacitor
9421 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9422 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9423 {
9424 if (!victim || !victim->IsAlive() || !IsPlayer())
9425 return false;
9426
9427 uint32 stack_spell_id = 0;
9428 switch (auraSpellInfo->Id)
9429 {
9430 case 37657:
9431 stack_spell_id = 37658;
9432 trigger_spell_id = 37661;
9433 break;
9434 case 54841:
9435 stack_spell_id = 54842;
9436 trigger_spell_id = 54843;
9437 break;
9438 case 67712:
9439 stack_spell_id = 67713;
9440 trigger_spell_id = 67714;
9441 break;
9442 case 67758:
9443 stack_spell_id = 67759;
9444 trigger_spell_id = 67760;
9445 break;
9446 }
9447
9448 if (cooldown && ToPlayer()->HasSpellCooldown(stack_spell_id))
9449 {
9450 return false;
9451 }
9452
9453 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9454
9455 Aura* dummy = GetAura(stack_spell_id);
9456 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9457 {
9458 return false;
9459 }
9460
9461 if (cooldown)
9462 {
9463 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9464 }
9465 RemoveAurasDueToSpell(stack_spell_id);
9466 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9467 return true;
9468 }
9469 default:
9470 // Illumination
9471 if (auraSpellInfo->SpellIconID == 241)
9472 {
9473 if (!procSpell)
9474 return false;
9475 // procspell is triggered spell but we need mana cost of original casted spell
9476 uint32 originalSpellId = procSpell->Id;
9477 // Holy Shock heal
9478 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9479 {
9480 switch (procSpell->Id)
9481 {
9482 case 25914:
9483 originalSpellId = 20473;
9484 break;
9485 case 25913:
9486 originalSpellId = 20929;
9487 break;
9488 case 25903:
9489 originalSpellId = 20930;
9490 break;
9491 case 27175:
9492 originalSpellId = 27174;
9493 break;
9494 case 33074:
9495 originalSpellId = 33072;
9496 break;
9497 case 48820:
9498 originalSpellId = 48824;
9499 break;
9500 case 48821:
9501 originalSpellId = 48825;
9502 break;
9503 default:
9504 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9505 return false;
9506 }
9507 }
9508 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9509 if (!originalSpell)
9510 {
9511 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9512 return false;
9513 }
9514 // percent stored in effect 1 (class scripts) base points
9515 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9516 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9517 trigger_spell_id = 20272;
9518 target = this;
9519 }
9520 break;
9521 }
9522 break;
9523 }
9524 case SPELLFAMILY_SHAMAN:
9525 {
9526 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9527 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9528 {
9529 // Do not proc off from self-casted items
9530 if (Spell const* spell = eventInfo.GetProcSpell())
9531 {
9532 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9533 {
9534 return false;
9535 }
9536 }
9537
9538 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9539 }
9540 // Nature's Guardian
9541 else if (auraSpellInfo->SpellIconID == 2013)
9542 {
9543 // Check health condition - should drop to less 30% (damage deal after this!)
9544 if (!HealthBelowPctDamaged(30, damage))
9545 return false;
9546
9547 if (victim && victim->IsAlive())
9548 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9549
9550 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9551 trigger_spell_id = 31616;
9552 target = this;
9553 }
9554 break;
9555 }
9557 {
9558 // Acclimation
9559 if (auraSpellInfo->SpellIconID == 1930)
9560 {
9561 if (!procSpell)
9562 return false;
9563 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9564 {
9566 return false; // ignore
9567 case SPELL_SCHOOL_HOLY:
9568 trigger_spell_id = 50490;
9569 break;
9570 case SPELL_SCHOOL_FIRE:
9571 trigger_spell_id = 50362;
9572 break;
9574 trigger_spell_id = 50488;
9575 break;
9576 case SPELL_SCHOOL_FROST:
9577 trigger_spell_id = 50485;
9578 break;
9580 trigger_spell_id = 50489;
9581 break;
9583 trigger_spell_id = 50486;
9584 break;
9585 default:
9586 return false;
9587 }
9588 }
9589 // Blood Presence (Improved)
9590 else if (auraSpellInfo->Id == 63611)
9591 {
9592 if (!IsPlayer())
9593 return false;
9594
9595 trigger_spell_id = 50475;
9596 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9597 }
9598 break;
9599 }
9600 }
9601 }
9602
9603 // All ok. Check current trigger spell
9604 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9605 if (!triggerEntry)
9606 {
9607 // Don't cast unknown spell
9608 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9609 return false;
9610 }
9611
9612 // not allow proc extra attack spell at extra attack
9613 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9614 {
9615 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9616
9617 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9618 if (lastExtraAttackSpell == trigger_spell_id)
9619 {
9620 return false;
9621 }
9622
9623 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9624 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9625 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9626 {
9627 return false;
9628 }
9629 }
9630
9631 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9632 // Custom triggered spells
9633 switch (auraSpellInfo->Id)
9634 {
9635 // Deep Wounds
9636 case 12834:
9637 case 12849:
9638 case 12867:
9639 {
9640 if (!IsPlayer())
9641 return false;
9642
9643 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9645 else
9647 break;
9648 }
9649 // Persistent Shield (Scarab Brooch trinket)
9650 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9651 case 26467:
9652 {
9653 basepoints0 = int32(CalculatePct(damage, 15));
9654 target = victim;
9655 trigger_spell_id = 26470;
9656 break;
9657 }
9658 // Unyielding Knights (item exploit 29108\29109)
9659 case 38164:
9660 {
9661 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9662 return false;
9663 break;
9664 }
9665 // Deflection
9666 case 52420:
9667 {
9668 if (!HealthBelowPct(35))
9669 return false;
9670 break;
9671 }
9672
9673 // Cheat Death
9674 case 28845:
9675 {
9676 // When your health drops below 20%
9677 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9678 return false;
9679 break;
9680 }
9681 // Deadly Swiftness (Rank 1)
9682 case 31255:
9683 {
9684 // whenever you deal damage to a target who is below 20% health.
9685 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9686 return false;
9687
9688 target = this;
9689 trigger_spell_id = 22588;
9690 [[fallthrough]];
9691 }
9692 // Bonus Healing (Crystal Spire of Karabor mace)
9693 case 40971:
9694 {
9695 // If your target is below $s1% health
9696 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9697 return false;
9698 break;
9699 }
9700 // Rapid Recuperation
9701 case 53228:
9702 case 53232:
9703 {
9704 // This effect only from Rapid Fire (ability cast)
9705 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9706 return false;
9707 break;
9708 }
9709 // Decimation
9710 case 63156:
9711 case 63158:
9712 // Can proc only if target has hp below 35%
9713 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9714 return false;
9715 break;
9716 // Ulduar, Hodir, Toasty Fire
9717 case 62821:
9718 if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it
9719 return false;
9720 break;
9721 case 15337: // Improved Spirit Tap (Rank 1)
9722 case 15338: // Improved Spirit Tap (Rank 2)
9723 {
9724 if (!procSpell)
9725 return false;
9726
9727 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9728 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9729 return false;
9730
9731 target = victim;
9732 break;
9733 }
9734 // Professor Putricide - Ooze Spell Tank Protection
9735 case 71770:
9736 if (victim)
9737 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9738 return true;
9739 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9740 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9741 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9742 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9743 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9744 {
9745 // Procs only if damage takes health below $s1%
9746 if (!HealthBelowPctDamaged(triggerAmount, damage))
9747 return false;
9748 break;
9749 }
9750 default:
9751 break;
9752 }
9753
9754 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9755 {
9756 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9757 // Item - Death Knight T10 Melee 4P Bonus
9758 if (auraSpellInfo->Id == 70656)
9759 {
9761 return false;
9762
9763 for (uint8 i = 0; i < MAX_RUNES; ++i)
9764 if (ToPlayer()->GetRuneCooldown(i) == 0)
9765 return false;
9766 }
9767 // Blade Barrier
9768 else if (auraSpellInfo->SpellIconID == 85)
9769 {
9770 Player* plr = ToPlayer();
9771 if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
9772 return false;
9773
9775 return false;
9776 }
9777 // Rime
9778 else if (auraSpellInfo->SpellIconID == 56)
9779 {
9780 if (!IsPlayer())
9781 return false;
9782
9783 // Howling Blast
9785 }
9786 }
9787
9788 // Custom basepoints/target for exist spell
9789 // dummy basepoints or other customs
9790 switch (trigger_spell_id)
9791 {
9792 // Auras which should proc on area aura source (caster in this case):
9793 // Turn the Tables
9794 case 52914:
9795 case 52915:
9796 case 52910:
9797 // Honor Among Thieves
9798 case 51699:
9799 {
9800 target = triggeredByAura->GetBase()->GetCaster();
9801 if (!target)
9802 return false;
9803
9804 if (Player* pTarget = target->ToPlayer())
9805 {
9806 if (cooldown)
9807 {
9808 if (pTarget->HasSpellCooldown(trigger_spell_id))
9809 return false;
9810 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9811 }
9812
9813 Unit* cptarget = nullptr;
9814 if (trigger_spell_id == 51699)
9815 {
9816 cptarget = pTarget->GetComboTarget();
9817 if (!cptarget)
9818 {
9819 cptarget = pTarget->GetSelectedUnit();
9820 }
9821 }
9822 else
9823 cptarget = target;
9824
9825 if (cptarget)
9826 {
9827 target->CastSpell(cptarget, trigger_spell_id, true);
9828 return true;
9829 }
9830 }
9831 return false;
9832 }
9833 // Cast positive spell on enemy target
9834 case 20233: // Improved Lay on Hands (cast on target)
9835 {
9836 target = victim;
9837 break;
9838 }
9839 // Ruby Drake, Evasive Aura
9840 case 50241:
9841 {
9842 if (GetAura(50240))
9843 return false;
9844
9845 break;
9846 }
9847 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9848 case 15250: // Rogue Setup
9849 {
9850 // applied only for main target
9851 if (!victim || (IsPlayer() && victim != ToPlayer()->GetSelectedUnit()))
9852 return false;
9853 break; // continue normal case
9854 }
9855 // Finish movies that add combo
9856 case 14189: // Seal Fate (Netherblade set)
9857 case 14157: // Ruthlessness
9858 {
9859 victim = nullptr;
9860 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9861 break;
9862 }
9863 // Item - Druid T10 Balance 2P Bonus
9864 case 16870:
9865 {
9866 if (HasAura(70718))
9867 CastSpell(this, 70721, true);
9868 RemoveAurasDueToSpell(trigger_spell_id);
9869 break;
9870 }
9871 // Shamanistic Rage triggered spell
9872 case 30824:
9873 {
9874 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9875 break;
9876 }
9877 // Enlightenment (trigger only from mana cost spells)
9878 case 35095:
9879 {
9880 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9881 return false;
9882 break;
9883 }
9884 case 46916: // Slam! (Bloodsurge proc)
9885 case 52437: // Sudden Death
9886 {
9887 // Item - Warrior T10 Melee 4P Bonus
9888 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9889 {
9890 if (!roll_chance_i(aurEff->GetAmount()))
9891 {
9892 // Xinef: dont allow normal proc to override set one
9893 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9894 return false;
9895 // Xinef: just to be sure
9896 RemoveAurasDueToSpell(70849);
9897 break;
9898 }
9899
9900 // Xinef: fully remove all auras and reapply once more
9901 RemoveAurasDueToSpell(70849);
9902 RemoveAurasDueToSpell(71072);
9903 RemoveAurasDueToSpell(71069);
9904
9905 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9906 if (trigger_spell_id == 46916)
9907 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9908 else
9909 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9910 }
9911 break;
9912 }
9913 // Sword and Board
9914 case 50227:
9915 {
9916 // Remove cooldown on Shield Slam
9917 if (IsPlayer())
9919 break;
9920 }
9921 // Maelstrom Weapon
9922 case 53817:
9923 {
9924 // have rank dependent proc chance, ignore too often cases
9925 // PPM = 2.5 * (rank of talent),
9926 uint32 rank = auraSpellInfo->GetRank();
9927 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9928 if (!roll_chance_i(20 * rank))
9929 return false;
9930
9931 // Item - Shaman T10 Enhancement 4P Bonus
9932 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9933 if (Aura const* maelstrom = GetAura(53817))
9934 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9935 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9936 CastSpell(this, 70831, true, castItem, triggeredByAura);
9937
9938 break;
9939 }
9940 // Astral Shift
9941 case 52179:
9942 {
9943 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9944 return false;
9945
9946 // Need stun, fear or silence mechanic
9947 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9948 return false;
9949 break;
9950 }
9951 // Glyph of Death's Embrace
9952 case 58679:
9953 {
9954 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9955 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9956 return false;
9957 break;
9958 }
9959 // Glyph of Death Grip
9960 case 58628:
9961 {
9962 // remove cooldown of Death Grip
9963 if (IsPlayer())
9964 ToPlayer()->RemoveSpellCooldown(49576, true);
9965 return true;
9966 }
9967 // Savage Defense
9968 case 62606:
9969 {
9970 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9971 break;
9972 }
9973 // Body and Soul
9974 case 64128:
9975 case 65081:
9976 {
9977 // Proc only from PW:S cast
9978 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9979 return false;
9980 break;
9981 }
9982 // Culling the Herd
9983 case 70893:
9984 {
9985 if (!procSpell)
9986 {
9987 return false;
9988 }
9989 // check if we're doing a critical hit
9990 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9991 return false;
9992 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9993 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
9994 return false;
9995 break;
9996 }
9997 // Fingers of Frost, synchronise with Frostbite
9998 case 44544:
9999 {
10000 if (procPhase == PROC_SPELL_PHASE_HIT)
10001 {
10002 // Find Frostbite
10004 {
10005 if (!victim)
10006 return false;
10007
10008 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
10009 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
10010 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
10011
10012 if (roll_chance_i(chance))
10013 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
10014 }
10015 }
10016 break;
10017 }
10018 }
10019
10020 // try detect target manually if not set
10021 if (!target)
10022 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
10023
10024 if (cooldown)
10025 {
10026 if (HasSpellCooldown(triggerEntry->Id))
10027 return false;
10028
10029 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
10030 }
10031
10032 if (basepoints0)
10033 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
10034 else
10035 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
10036
10037 return true;
10038}
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition SharedDefines.h:808
@ SPELL_ATTR1_NO_THREAT
Definition SharedDefines.h:440
@ MECHANIC_FEAR
Definition SharedDefines.h:1341
@ MECHANIC_SILENCE
Definition SharedDefines.h:1345
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition SharedDefines.h:1316
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition SpellAuraDefines.h:172
@ PROC_SPELL_PHASE_HIT
Definition SpellMgr.h:243
@ FORM_DIREBEAR
Definition UnitDefines.h:77
@ FORM_MOONKIN
Definition UnitDefines.h:98
@ FORM_NONE
Definition UnitDefines.h:69
@ FORM_CAT
Definition UnitDefines.h:70
@ FORM_TREE
Definition UnitDefines.h:71
@ FORM_BEAR
Definition UnitDefines.h:74
@ SPELL_HACK_AND_SLASH
Definition Unit.h:299
@ SPELL_SWORD_SPECIALIZATION
Definition Unit.h:298
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition Creature.cpp:2214
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition Player.cpp:13522
void RemoveCategoryCooldown(uint32 cat)
Definition Player.cpp:3538
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1301
Spell const * GetProcSpell() const
Definition Unit.h:455
Unit * GetActor()
Definition Unit.h:446
uint8 GetRank() const
Definition SpellInfo.cpp:2390
uint32 ManaCostPercentage
Definition SpellInfo.h:367
bool HasEffect(SpellEffects effect) const
Definition SpellInfo.cpp:876
uint32 ManaCost
Definition SpellInfo.h:363
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition ThreatMgr.cpp:508
bool HealthAbovePct(int32 pct) const
Definition Unit.h:1103
Creature * GetCompanionPet() const
Definition Unit.cpp:10870
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:15663
uint32 GetLastExtraAttackSpell() const
Definition Unit.h:995
uint32 GetCreateHealth() const
Definition Unit.h:1097
Unit * GetComboTarget() const
Definition Unit.h:1001
float GetStat(Stats stat) const
Definition Unit.h:1043
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:1102

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), GetComboTarget(), GetCompanionPet(), GetCreateHealth(), GetCreateMana(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4386{
4387 if (thisUnit->SafeUnitPointerSet.empty())
4388 return;
4389 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4390 (*itr)->UnitDeleted();
4391
4392 thisUnit->SafeUnitPointerSet.clear();
4393}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19533{
19534 Creature* creature = ToCreature();
19535 if (creature && creature->IsAIEnabled)
19536 {
19537 if (!creature->AI()->BeforeSpellClick(clicker))
19538 {
19539 return false;
19540 }
19541 }
19542
19543 bool result = false;
19544 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19545 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19546 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19547 {
19549 if (!itr->second.IsFitToRequirements(clicker, this))
19550 continue;
19551
19553 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19554 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19555 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19556 continue;
19557
19558 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19559 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19560 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19561
19562 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19563
19564 // xinef: dont allow players to enter vehicles on arena
19565 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19566 continue;
19567
19568 if (seatId > -1)
19569 {
19570 uint8 i = 0;
19571 bool valid = false;
19572 while (i < MAX_SPELL_EFFECTS)
19573 {
19574 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19575 {
19576 valid = true;
19577 break;
19578 }
19579 ++i;
19580 }
19581
19582 if (!valid)
19583 {
19584 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19585 continue;
19586 }
19587
19588 if (IsInMap(caster))
19589 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19590 else // This can happen during Player::_LoadAuras
19591 {
19593 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19594 bp0[j] = spellInfo->Effects[j].BasePoints;
19595
19596 bp0[i] = seatId;
19597 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19598 }
19599 }
19600 else
19601 {
19602 if (IsInMap(caster))
19603 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19604 else
19605 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19606 }
19607
19608 result = true;
19609 }
19610
19611 if (creature && creature->IsAIEnabled)
19612 creature->AI()->OnSpellClick(clicker, result);
19613
19614 return result;
19615}
#define sConditionMgr
Definition ConditionMgr.h:292
std::list< Condition * > ConditionList
Definition ConditionMgr.h:239
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition ObjectMgr.h:408
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition SharedDefines.h:702
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition SharedDefines.h:703
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition SharedDefines.h:701
SpellValueMod
Definition SpellDefines.h:112
virtual void OnSpellClick(Unit *, bool &)
Definition CreatureAI.h:207
virtual bool BeforeSpellClick(Unit *)
Definition CreatureAI.h:205
bool IsBattleArena() const
Definition Map.h:302
bool HasAura(AuraType aura) const
Definition SpellInfo.cpp:893
uint32 GetCreatureEntry() const
Definition Vehicle.h:39
Map * FindMap() const
Definition Object.h:621
Definition ConditionMgr.h:184

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, and Aura::TryRefreshStackOrCreate().

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), boss_kologarn::boss_kologarnAI::AttachLeftArm(), boss_kologarn::boss_kologarnAI::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI().

◆ HandleStatFlatModifier()

bool Unit::HandleStatFlatModifier ( UnitMods  unitMod,
UnitModifierFlatType  modifierType,
float  amount,
bool  apply 
)
15314{
15315 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_FLAT_END)
15316 {
15317 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15318 return false;
15319 }
15320
15321 if (!amount)
15322 return false;
15323
15324 switch (modifierType)
15325 {
15326 case BASE_VALUE:
15327 case TOTAL_VALUE:
15328 m_auraFlatModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15329 break;
15330 default:
15331 break;
15332 }
15333
15334 UpdateUnitMod(unitMod);
15335 return true;
15336}
void apply(T *val)
Definition ByteConverter.h:40

References BASE_VALUE, LOG_ERROR, m_auraFlatModifiersGroup, MODIFIER_TYPE_FLAT_END, TOTAL_VALUE, UNIT_MOD_END, and UpdateUnitMod().

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), and Player::UpdateDamageDoneMods().

◆ HasActivePowerType()

◆ HasAllAuras()

template<typename... Auras>
bool Unit::HasAllAuras ( Auras...  spellIds) const
inline

Checks if the unit has ALL specified auras.

Template Parameters
AurasCan be any type convertible to uint32.
Parameters
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the unit has ALL of the specified auras. Otherwise false.
1473 {
1474 std::vector<uint32> spellList = { static_cast<uint32>(spellIds)... };
1475 return HasAuras(SearchMethod::MatchAll, spellList);
1476 }
bool HasAuras(SearchMethod sm, std::vector< uint32 > &spellIds) const
Check if unit has ANY or ALL specified auras.
Definition Unit.cpp:5817

References HasAuras(), and MatchAll.

Referenced by achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), npc_alchemist_adrianna::OnGossipHello(), and npc_nelson::npc_nelsonAI::SpellHit().

◆ HasAllowOnlyAbilityAura()

bool Unit::HasAllowOnlyAbilityAura ( ) const
inline
@ SPELL_AURA_ALLOW_ONLY_ABILITY
Definition SpellAuraDefines.h:326
bool HasAuraType(AuraType auraType) const
Definition Unit.cpp:5847

References HasAuraType(), and SPELL_AURA_ALLOW_ONLY_ABILITY.

Referenced by AuraEffect::HandleAuraAllowOnlyAbility().

◆ HasAnyAuras()

template<typename... Auras>
bool Unit::HasAnyAuras ( Auras...  spellIds) const
inline

◆ HasAOECharmAura()

bool Unit::HasAOECharmAura ( ) const
inline
@ SPELL_AURA_AOE_CHARM
Definition SpellAuraDefines.h:240

References HasAuraType(), and SPELL_AURA_AOE_CHARM.

◆ HasAttackerSpellCritChanceAura()

bool Unit::HasAttackerSpellCritChanceAura ( ) const
inline
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:242

References HasAuraType(), and SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE.

Referenced by SpellTakenCritChance().

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5841{
5842 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5843 return true;
5844 return false;
5845}

References GetAuraApplication().

Referenced by at_hol_hall_of_watchers::_OnTrigger(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyItemDependentAuras(), Player::ApplyItemObtainSpells(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_leotheras_the_blind::AttackStart(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_parasitic_shadowfiend::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_q12237_rescue_villager::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_jenny::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_thekal::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_anub_arak::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::DoAction(), boss_illidan_stormrage::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), Spell::finish(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), Player::GetResurrectionSpellId(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_braziers_hit::HandleAfterEffectApply(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), HasAuras(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), boss_krik_thir::boss_krik_thirAI::IsInFrenzy(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), boss_alar::JustDied(), npc_sunblade_scout::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::JustEngagedWith(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::JustEngagedWith(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::JustEngagedWith(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_faerlina::boss_faerlinaAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::KilledUnit(), Creature::LoadCreaturesAddon(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_felmyst::MovementInform(), boss_kagani_nightstrike::MovementInform(), achievement_fa_la_la_la_ogrila::OnCheck(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), DefaultTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), boss_janalai::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::Reset(), boss_illidan_stormrage::Reset(), boss_fathomlord_karathress::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipHello(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_necropolis::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_dark_fiend::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5788{
5789 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5790 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5791 {
5792 if (itr->second->HasEffect(effIndex)
5793 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5794 {
5795 return true;
5796 }
5797 }
5798 return false;
5799}

References m_appliedAuras.

Referenced by AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuras()

bool Unit::HasAuras ( SearchMethod  sm,
std::vector< uint32 > &  spellIds 
) const

Check if unit has ANY or ALL specified auras.

Parameters
smThe search method to use
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the search method condition is met. Otherwise false.
5818{
5819 if (sm == SearchMethod::MatchAll)
5820 {
5821 for (auto const& spellId : spellIds)
5822 if (!HasAura(spellId))
5823 return false;
5824 return true;
5825 }
5826 else if (sm == SearchMethod::MatchAny)
5827 {
5828 for (auto const& spellId : spellIds)
5829 if (HasAura(spellId))
5830 return true;
5831 return false;
5832 }
5833 else
5834 {
5835 LOG_ERROR("entities.unit", "Unit::HasAuras using non-supported SearchMethod {}", sm);
5836 return false;
5837 }
5838}

References HasAura(), LOG_ERROR, MatchAll, and MatchAny.

Referenced by HasAllAuras(), and HasAnyAuras().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10752{
10753 if (Caster)
10754 {
10755 if (spellProto)
10756 {
10757 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10758 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10759 if ((*j)->IsAffectedOnSpell(spellProto))
10760 return true;
10761 }
10762 // Check per caster aura state
10763 // If aura with aurastate by caster not found return false
10764 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10765 {
10766 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10767 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10768 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10769 return true;
10770 return false;
10771 }
10772 }
10773
10774 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10775}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition Unit.h:669

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5848{
5849 return (!m_modAuras[auraType].empty());
5850}

References m_modAuras.

Referenced by Player::CanTameExoticPets(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleForceMoveForward(), HasAllowOnlyAbilityAura(), HasAOECharmAura(), HasAttackerSpellCritChanceAura(), HasAuraTypeWithFamilyFlags(), HasCloneCasterAura(), HasConfuseAura(), HasControlVehicleAura(), HasDecreaseSpeedAura(), HasDetectAmoreAura(), HasDetectSpellsAura(), HasFearAura(), HasFeatherFallAura(), HasFlyAura(), HasGhostAura(), HasHealthRegenInCombatAura(), HasHoverAura(), HasIgnoreHitDirectionAura(), HasIgnoreTargetResistAura(), HasIncreaseMountedFlightSpeedAura(), HasIncreaseMountedSpeedAura(), HasInterruptRegenAura(), HasInvisibilityAura(), HasInvisibilityDetectAura(), HasMountedAura(), HasNoPVPCreditAura(), HasOpenStableAura(), HasPacifyAura(), HasPacifySilenceAura(), HasPeriodicDummyAura(), HasPreventDurabilityLossAura(), HasPreventResurectionAura(), HasPreventsFleeingAura(), HasReflectSpellsAura(), HasRegenDuringCombatAura(), HasRootAura(), HasShapeshiftAura(), HasSilenceAura(), HasSpellMagnetAura(), HasSpiritOfRedemptionAura(), HasStealthAura(), HasStealthDetectAura(), HasStunAura(), HasTauntAura(), HasThreatAura(), HasTransformAura(), HasUnattackableAura(), HasWaterBreathingAura(), HasWaterWalkAura(), Player::IsFreeFlying(), and Player::SendInitialPacketsAfterAddToMap().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5881{
5882 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5883 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5884 if ((*i)->IsAffectedOnSpell(affectedSpell))
5885 return true;
5886 return false;
5887}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5853{
5854 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5855 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5856 if (caster == (*i)->GetCasterGUID())
5857 return true;
5858 return false;
5859}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), PatchValuesUpdate(), and ThreatContainer::SelectNextVictim().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
780{
781 if (!HasAuraType(auraType))
782 return false;
783 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
784 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
785 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
786 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
787 return true;
788 return false;
789}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5872{
5873 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5874 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5875 if (miscvalue == (*i)->GetMiscValue())
5876 return true;
5877 return false;
5878}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5899{
5900 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5901 {
5902 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5903 {
5904 return true;
5905 }
5906 }
5907
5908 return false;
5909}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5890{
5891 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5892 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5893 if (value == (*i)->GetAmount())
5894 return true;
5895 return false;
5896}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5935{
5936 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5937 {
5938 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5939 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5940 return true;
5941
5942 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5943 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5944 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5945 return true;
5946 }
5947
5948 return false;
5949}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
792{
793 AuraEffectList const& auras = GetAuraEffectsByType(type);
794 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
795 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
796 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
797 return true;
798 return false;
799}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
802{
803 uint32 excludeAura = 0;
804 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
805 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
806
812}
@ SPELL_AURA_MOD_FEAR
Definition SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition SpellAuraDefines.h:119
@ SPELL_AURA_MOD_CONFUSE
Definition SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition Unit.cpp:791
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1561

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasCloneCasterAura()

bool Unit::HasCloneCasterAura ( ) const
inline
@ SPELL_AURA_CLONE_CASTER
Definition SpellAuraDefines.h:310

References HasAuraType(), and SPELL_AURA_CLONE_CASTER.

Referenced by WorldSession::HandleMirrorImageDataRequest().

◆ HasConfuseAura()

bool Unit::HasConfuseAura ( ) const
inline

◆ HasControlVehicleAura()

bool Unit::HasControlVehicleAura ( ) const
inline

◆ HasDecreaseSpeedAura()

bool Unit::HasDecreaseSpeedAura ( ) const
inline

◆ HasDetectAmoreAura()

bool Unit::HasDetectAmoreAura ( ) const
inline
@ SPELL_AURA_DETECT_AMORE
Definition SpellAuraDefines.h:233

References HasAuraType(), and SPELL_AURA_DETECT_AMORE.

Referenced by AuraEffect::HandleDetectAmore().

◆ HasDetectSpellsAura()

bool Unit::HasDetectSpellsAura ( ) const
inline
@ SPELL_AURA_DEFLECT_SPELLS
Definition SpellAuraDefines.h:350

References HasAuraType(), and SPELL_AURA_DEFLECT_SPELLS.

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasFearAura()

◆ HasFeatherFallAura()

bool Unit::HasFeatherFallAura ( ) const
inline
@ SPELL_AURA_FEATHER_FALL
Definition SpellAuraDefines.h:168

References HasAuraType(), and SPELL_AURA_FEATHER_FALL.

Referenced by Player::HandleFall().

◆ HasFlyAura()

◆ HasGhostAura()

bool Unit::HasGhostAura ( ) const
inline

◆ HasHealthRegenInCombatAura()

bool Unit::HasHealthRegenInCombatAura ( ) const
inline
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition SpellAuraDefines.h:224

References HasAuraType(), and SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT.

Referenced by Player::RegenerateAll().

◆ HasHoverAura()

bool Unit::HasHoverAura ( ) const
inline
1782{ return HasAuraType(SPELL_AURA_HOVER); };
@ SPELL_AURA_HOVER
Definition SpellAuraDefines.h:169

References HasAuraType(), and SPELL_AURA_HOVER.

Referenced by Player::HandleFall(), and Creature::UpdateMovementFlags().

◆ HasIgnoreHitDirectionAura()

bool Unit::HasIgnoreHitDirectionAura ( ) const
inline

◆ HasIgnoreTargetResistAura()

bool Unit::HasIgnoreTargetResistAura ( ) const
inline

◆ HasIncreaseMountedFlightSpeedAura()

◆ HasIncreaseMountedSpeedAura()

bool Unit::HasIncreaseMountedSpeedAura ( ) const
inline
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition SpellAuraDefines.h:95

References HasAuraType(), and SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED.

◆ HasInterruptRegenAura()

bool Unit::HasInterruptRegenAura ( ) const
inline
@ SPELL_AURA_INTERRUPT_REGEN
Definition SpellAuraDefines.h:157

References HasAuraType(), and SPELL_AURA_INTERRUPT_REGEN.

Referenced by Player::Regenerate().

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasInvisibilityDetectAura()

bool Unit::HasInvisibilityDetectAura ( ) const
inline
@ SPELL_AURA_MOD_INVISIBILITY_DETECT
Definition SpellAuraDefines.h:82

References HasAuraType(), and SPELL_AURA_MOD_INVISIBILITY_DETECT.

Referenced by AuraEffect::HandleModInvisibilityDetect().

◆ HasLeewayMovement()

bool Unit::HasLeewayMovement ( ) const
inline
1710 {
1712 && !IsWalking();
1713 }
@ MOVEMENTFLAG_STRAFE_LEFT
Definition UnitDefines.h:371
@ MOVEMENTFLAG_STRAFE_RIGHT
Definition UnitDefines.h:372
bool IsWalking() const
Definition Unit.h:1687
bool HasMovementFlag(uint32 flag) const
Definition Object.h:345

References MovementInfo::HasMovementFlag(), IsWalking(), WorldObject::m_movementInfo, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_STRAFE_LEFT, and MOVEMENTFLAG_STRAFE_RIGHT.

Referenced by Spell::CheckRange(), and IsWithinMeleeRange().

◆ HasMainhandWeapon()

bool Unit::HasMainhandWeapon ( ) const
inline
968{ return HasWeapon(BASE_ATTACK); }
virtual bool HasWeapon(WeaponAttackType type) const =0

References BASE_ATTACK, and HasWeapon().

◆ hasMainhandWeaponForAttack()

bool Unit::hasMainhandWeaponForAttack ( ) const
inline
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition Unit.h:973

References BASE_ATTACK, and HasWeaponForAttack().

◆ HasMainhandWeaponForAttack()

bool Unit::HasMainhandWeaponForAttack ( ) const
inline

◆ HasMountedAura()

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5924{
5925 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5926 {
5927 Aura const* aura = iter->second->GetBase();
5928 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5929 return true;
5930 }
5931 return false;
5932}
uint32 Attributes
Definition SpellInfo.h:324

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5912{
5913 if (!(m_interruptMask & flag))
5914 return false;
5915 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5916 {
5917 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5918 return true;
5919 }
5920 return false;
5921}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNoPVPCreditAura()

bool Unit::HasNoPVPCreditAura ( ) const
inline
@ SPELL_AURA_NO_PVP_CREDIT
Definition SpellAuraDefines.h:222

References HasAuraType(), and SPELL_AURA_NO_PVP_CREDIT.

Referenced by Player::RewardHonor().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline

◆ HasOffhandWeapon()

bool Unit::HasOffhandWeapon ( ) const
inline
969{ return HasWeapon(OFF_ATTACK); }

References HasWeapon(), and OFF_ATTACK.

◆ HasOffhandWeaponForAttack()

◆ HasOpenStableAura()

bool Unit::HasOpenStableAura ( ) const
inline
@ SPELL_AURA_OPEN_STABLE
Definition SpellAuraDefines.h:355

References HasAuraType(), and SPELL_AURA_OPEN_STABLE.

◆ HasPacifyAura()

bool Unit::HasPacifyAura ( ) const
inline
@ SPELL_AURA_MOD_PACIFY
Definition SpellAuraDefines.h:88

References HasAuraType(), and SPELL_AURA_MOD_PACIFY.

Referenced by AuraEffect::HandleAuraModPacify(), and WorldSession::HandlePetActionHelper().

◆ HasPacifySilenceAura()

bool Unit::HasPacifySilenceAura ( ) const
inline

◆ HasPeriodicDummyAura()

bool Unit::HasPeriodicDummyAura ( ) const
inline

◆ HasPreventDurabilityLossAura()

bool Unit::HasPreventDurabilityLossAura ( ) const
inline
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition SpellAuraDefines.h:352

References HasAuraType(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by Player::DurabilityPointsLoss().

◆ HasPreventResurectionAura()

bool Unit::HasPreventResurectionAura ( ) const
inline

◆ HasPreventsFleeingAura()

bool Unit::HasPreventsFleeingAura ( ) const
inline
@ SPELL_AURA_PREVENTS_FLEEING
Definition SpellAuraDefines.h:155

References HasAuraType(), and SPELL_AURA_PREVENTS_FLEEING.

Referenced by Creature::DoFleeToGetAssistance().

◆ HasRangedWeapon()

bool Unit::HasRangedWeapon ( ) const
inline
970{ return HasWeapon(RANGED_ATTACK); }

References HasWeapon(), and RANGED_ATTACK.

◆ HasRangedWeaponForAttack()

bool Unit::HasRangedWeaponForAttack ( ) const
inline

◆ HasReflectSpellsAura()

bool Unit::HasReflectSpellsAura ( ) const
inline
@ SPELL_AURA_REFLECT_SPELLS
Definition SpellAuraDefines.h:91

References HasAuraType(), and SPELL_AURA_REFLECT_SPELLS.

Referenced by Spell::DoSpellHitOnUnit().

◆ HasRegenDuringCombatAura()

bool Unit::HasRegenDuringCombatAura ( ) const
inline
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition SpellAuraDefines.h:179

References HasAuraType(), and SPELL_AURA_MOD_REGEN_DURING_COMBAT.

Referenced by Player::RegenerateAll(), and Player::RegenerateHealth().

◆ HasRootAura()

bool Unit::HasRootAura ( ) const
inline

References HasAuraType(), and SPELL_AURA_MOD_ROOT.

Referenced by SetControlled().

◆ HasShapeshiftAura()

bool Unit::HasShapeshiftAura ( ) const
inline

◆ HasSharedVision()

◆ HasSilenceAura()

bool Unit::HasSilenceAura ( ) const
inline

◆ HasSpell()

virtual bool Unit::HasSpell ( uint32  ) const
inlinevirtual

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

1321{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasSpellMagnetAura()

bool Unit::HasSpellMagnetAura ( ) const
inline

◆ HasSpiritOfRedemptionAura()

◆ HasStealthAura()

◆ HasStealthDetectAura()

bool Unit::HasStealthDetectAura ( ) const
inline
@ SPELL_AURA_MOD_STEALTH_DETECT
Definition SpellAuraDefines.h:80

References HasAuraType(), and SPELL_AURA_MOD_STEALTH_DETECT.

Referenced by AuraEffect::HandleModStealthDetect().

◆ HasStunAura()

bool Unit::HasStunAura ( ) const
inline

◆ HasTauntAura()

bool Unit::HasTauntAura ( ) const
inline
@ SPELL_AURA_MOD_TAUNT
Definition SpellAuraDefines.h:74

References HasAuraType(), and SPELL_AURA_MOD_TAUNT.

Referenced by Creature::CanCreatureAttack(), and PetAI::SelectNextTarget().

◆ HasThreatAura()

bool Unit::HasThreatAura ( ) const
inline
@ SPELL_AURA_MOD_THREAT
Definition SpellAuraDefines.h:73

References HasAuraType(), and SPELL_AURA_MOD_THREAT.

Referenced by ApplyTotalThreatModifier().

◆ HasTransformAura()

bool Unit::HasTransformAura ( ) const
inline

◆ HasUnattackableAura()

bool Unit::HasUnattackableAura ( ) const
inline

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
737{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::boss_malygosAI::AttackStart(), SmartAI::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::JustSummoned(), CreatureGroup::LeaderMoveTo(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), MotionMaster::MoveWaypoint(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), WorldSession::ProcessMovementInfo(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), SetCharm(), Player::SetClientControl(), SetSpeed(), boss_the_lurker_below::SummonedCreatureDies(), boss_anub_arak::SummonedCreatureDies(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_heart::npc_xt002_heartAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI(), and WorldSession::VerifyMovementInfo().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
726{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), advisor_baseAI::advisor_baseAI(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), SmartAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_eck::boss_eck(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_halazzi::boss_halazzi(), boss_hexlord_malacrass::boss_hexlord_malacrass(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_janalai::boss_janalai(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_kiljaeden::boss_kiljaeden(), boss_krik_thir::boss_krik_thirAI::boss_krik_thirAI(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_rage_winterchill::boss_rage_winterchill(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_supremus::boss_supremus(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_taldaram::boss_taldaram(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_tenris_mirkblood::boss_tenris_mirkblood(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), boss_gurtogg_bloodboil::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), SpellInfo::CheckTarget(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), BossAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), IsImmobilizedState(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), Creature::IsUpdateNeeded(), CritterAI::JustEngagedWith(), boss_priestess_delrissa::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_novos::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), GridObjectLoader::LoadCreatures(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_kaelthas::MovementInform(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_kiljaeden_controller::npc_kiljaeden_controller(), npc_sunblade_arch_mage::npc_sunblade_arch_mage(), BossAI::OnSpellCastFinished(), Acore::FriendlyCCedInRange::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), ThreatContainer::SelectNextVictim(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetInCombatState(), SetInFront(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Creature::Update(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_anub_arak::UpdateAI(), boss_hadronox::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::UpdateAI(), boss_ionar::UpdateAI(), boss_volkhan::UpdateAI(), npc_molten_golem::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), npc_enslaved_proto_drake::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_overlord_drakuru_betrayal::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), npc_maiev_illidan::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::UpdateAI(), advisor_baseAI::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_enslaved_netherwing_drake::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5862{
5863 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5864 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5865 if ((*i)->GetBase()->CanBeSentToClient())
5866 return true;
5867
5868 return false;
5869}

References GetAuraEffectsByType().

◆ HasWaterBreathingAura()

bool Unit::HasWaterBreathingAura ( ) const
inline
@ SPELL_AURA_WATER_BREATHING
Definition SpellAuraDefines.h:145

References HasAuraType(), and SPELL_AURA_WATER_BREATHING.

Referenced by Player::getMaxTimer().

◆ HasWaterWalkAura()

bool Unit::HasWaterWalkAura ( ) const
inline
@ SPELL_AURA_WATER_WALK
Definition SpellAuraDefines.h:167

References HasAuraType(), and SPELL_AURA_WATER_WALK.

◆ HasWeapon()

virtual bool Unit::HasWeapon ( WeaponAttackType  type) const
pure virtual

Implemented in Creature, and Player.

Referenced by HasMainhandWeapon(), HasOffhandWeapon(), and HasRangedWeapon().

◆ HasWeaponForAttack()

virtual bool Unit::HasWeaponForAttack ( WeaponAttackType  type) const
inlinevirtual

Reimplemented in Creature, and Player.

973{ return CanUseAttackType(type); }
bool CanUseAttackType(WeaponAttackType attacktype) const
Definition Unit.h:977

References CanUseAttackType().

Referenced by hasMainhandWeaponForAttack(), HasMainhandWeaponForAttack(), HasOffhandWeaponForAttack(), HasRangedWeaponForAttack(), Creature::HasWeaponForAttack(), and Player::HasWeaponForAttack().

◆ haveOffhandWeapon()

bool Unit::haveOffhandWeapon ( ) const
523{
524 if (Player const* player = ToPlayer())
525 return player->GetWeaponForAttack(OFF_ATTACK, true);
526
527 return CanDualWield();
528}
bool CanDualWield() const
Definition Unit.h:963

References CanDualWield(), OFF_ATTACK, and Object::ToPlayer().

Referenced by boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), and boss_twin_valkyrAI::myDoMeleeAttackIfReady().

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11450{
11451 uint32 heal = healInfo.GetHeal();
11452 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11453 healInfo.SetHeal(heal);
11454
11455 // calculate heal absorb and reduce healing
11456 CalcHealAbsorb(healInfo);
11457
11458 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11459 healInfo.SetEffectiveHeal(gain);
11460
11461 SendHealSpellLog(healInfo, critical);
11462 return gain;
11463}
Unit * GetHealer() const
Definition Unit.h:417
void SetHeal(uint32 amount)
Definition Unit.h:407
void SetEffectiveHeal(uint32 amount)
Definition Unit.h:412
static void CalcHealAbsorb(HealInfo &healInfo)
Definition Unit.cpp:2538
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition Unit.cpp:11159
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition Unit.cpp:11432

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
1101{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), boss_kalec::JustEngagedWith(), boss_sathrovarr::JustEngagedWith(), npc_akama_illidan::JustEngagedWith(), npc_maiev_illidan::JustEngagedWith(), boss_olm_the_summoner::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_yazzai::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), npc_wild_wyrm::PassengerBoarded(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), and npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
1102{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition Define.h:102

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), npc_anub_ar_crusher::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), npc_xt002_boombot::npc_xt002_boombotAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_halazzi::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
15139{
15140 // Checking for existing in the table
15141 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15142 {
15143 if (i->DRGroup != group)
15144 continue;
15145 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15146 i->hitCount += 1;
15147 return;
15148 }
15150}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition SpellMgr.cpp:261
Definition Unit.h:279

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
16033{
16034 if (!m_charmInfo)
16035 m_charmInfo = new CharmInfo(this);
16036
16037 return m_charmInfo;
16038}
Definition CharmInfo.h:127

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1055 {
1056 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1057 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1058 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17640{
17641 Player* player = ToPlayer();
17642 PetStable& petStable = player->GetOrInitPetStable();
17643 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17644 return false;
17645
17646 pet->SetCreatorGUID(GetGUID());
17647 pet->SetFaction(GetFaction());
17648 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17649
17650 if (IsPlayer())
17652
17653 if (!pet->InitStatsForLevel(level))
17654 {
17655 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17656 return false;
17657 }
17658
17659 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17660 // this enables pet details window (Shift+P)
17661 pet->InitPetCreateSpells();
17662 pet->SetFullHealth();
17663 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17664 return true;
17665}
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition Pet.cpp:1018
Definition PetDefines.h:212
PetInfo const * GetUnslottedHunterPet() const
Definition PetDefines.h:240
Optional< PetInfo > CurrentPet
Definition PetDefines.h:235
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition Pet.cpp:2459
void InitPetCreateSpells()
Definition Pet.cpp:2034
PetStable & GetOrInitPetStable()
Definition Player.cpp:15695
void SetFullHealth()
Definition Unit.h:1111
void SetFaction(uint32 faction)
Definition Unit.cpp:10235
void ReplaceAllUnitFlags(UnitFlags flags)
Remove the Unit flag specify only.
Definition Unit.h:740
CharmInfo * GetCharmInfo()
Definition Unit.h:1266
void SetCreatorGUID(ObjectGuid creator)
Definition Unit.h:706
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition CharmInfo.cpp:240

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Object::IsPlayer(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), SetUInt32Value(), sObjectMgr, Object::ToPlayer(), UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom(), and CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4177{
4178 // generic spells are interrupted if they are not finished or delayed
4179 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4180 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4181
4182 // autorepeat spells are interrupted if they are not finished or delayed
4183 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4184 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4185
4186 // channeled spells are interrupted if they are not finished, even if they are delayed
4187 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4188 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4189}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), boss_onyxia::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_akilzon::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), boss_felblood_kaelthas::GravityLapseSequence(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), boss_shade_of_aran::JustEngagedWith(), npc_kilrek::JustEngagedWith(), boss_archimonde::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_gal_darah::JustEngagedWith(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustEngagedWith(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), npc_akama_illidan::PathEndReached(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_illidan_stormrage::ScheduleAbilities(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4105{
4106 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4107 Spell* spell = m_currentSpells[spellType];
4108 if (spell
4109 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4110 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4111 {
4112 // for example, do not let self-stun aura interrupt itself
4113 if (!spell->IsInterruptable())
4114 return;
4115
4116 // send autorepeat cancel message for autorepeat spells
4117 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4118 if (IsPlayer())
4120
4121 if (spell->getState() != SPELL_STATE_FINISHED)
4122 spell->cancel(bySelf);
4123 else
4124 {
4125 m_currentSpells[spellType] = nullptr;
4126 spell->SetReferencedFromCurrent(false);
4127 }
4128
4129 if (IsCreature() && IsAIEnabled)
4131 }
4132}
@ SPELL_FINISHED_CANCELED
Definition Spell.h:99
@ SPELL_STATE_DELAYED
Definition Spell.h:239
virtual void OnSpellCastFinished(SpellInfo const *, SpellFinishReason)
Definition CreatureAI.h:151
void SendAutoRepeatCancel(Unit *target)
Definition PlayerMisc.cpp:152
bool IsInterruptable() const
Definition Spell.h:572
int32 GetCastTime() const
Definition Spell.h:558
uint32 getState() const
Definition Spell.h:493
void cancel(bool bySelf=false)
Definition Spell.cpp:3648

References Creature::AI(), Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::GetSpellInfo(), Spell::getState(), IsAIEnabled, Object::IsCreature(), Spell::IsInterruptable(), Object::IsPlayer(), m_currentSpells, CreatureAI::OnSpellCastFinished(), Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_FINISHED_CANCELED, SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, Object::ToCreature(), and Object::ToPlayer().

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
2207{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1773{ return (m_deathState == DeathState::Alive); };

References Alive, and m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Battleground::AddPlayer(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freyaAI::boss_freyaAI(), boss_hodir::boss_hodirAI::boss_hodirAI(), boss_mimiron::boss_mimironAI::boss_mimironAI(), boss_thorim::boss_thorimAI::boss_thorimAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_q12237_rescue_villager::CheckCast(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::CheckRequirementInternal(), boss_heigan::CheckSafetyDance(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), boss_krik_thir::boss_krik_thirAI::GetData(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_dred_raptor_call::HandleDummy(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), npc_kiljaeden_controller::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), GridObjectLoader::LoadCreatures(), Player::LoadFromDB(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::OnPeriodic(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), SmartScript::ProcessAction(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_kiljaeden::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), BossAI::ScheduleEnrageTimer(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::SetData(), npc_enslaved_proto_drake::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), SetFeared(), SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), npc_dark_iron_guzzler::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14379{
14381 return true;
14382
14383 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14384 return true;
14385
14386 if (Player* ownerPlayer = GetSpellModOwner())
14387 if (Player const* seerPlayer = seer->ToPlayer())
14388 {
14389 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14390 return true;
14391 }
14392
14393 return false;
14394}
@ SPELL_AURA_MOD_STALKED
Definition SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition Object.h:759

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

: Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.

Reimplemented from WorldObject.

14360{
14362 return true;
14363
14364 // Always seen by owner
14365 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14366 if (seer->GetGUID() == guid)
14367 return true;
14368
14369 if (Player const* seerPlayer = seer->ToPlayer())
14370 if (Unit* owner = GetOwner())
14371 if (Player* ownerPlayer = owner->ToPlayer())
14372 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14373 return true;
14374
14375 return false;
14376}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition Object.h:756

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition UnitDefines.h:331
bool HasNpcFlag(NPCFlags flags) const
Definition Unit.h:753

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10667{
10669 return true;
10670
10671 if (!m_Controlled.empty())
10672 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10673 if ((*itr)->isAttackingPlayer())
10674 return true;
10675
10676 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10677 if (m_SummonSlot[i])
10678 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10679 if (summon->isAttackingPlayer())
10680 return true;
10681
10682 return false;
10683}
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:2357

References Map::GetCreature(), WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAttackSpeedOverridenShapeShift()

bool Unit::IsAttackSpeedOverridenShapeShift ( ) const
19493{
19494 // Mirroring clientside gameplay logic
19495 if (ShapeshiftForm form = GetShapeshiftForm())
19496 if (SpellShapeshiftFormEntry const* entry = sSpellShapeshiftFormStore.LookupEntry(form))
19497 return entry->attackSpeed > 0;
19498
19499 return false;
19500}

References GetShapeshiftForm(), and sSpellShapeshiftFormStore.

Referenced by Player::CalculateMinMaxDamage().

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition UnitDefines.h:340

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition UnitDefines.h:336

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

692{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3165{
3167 return true;
3168 return false;
3169}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline

◆ IsClass()

◆ IsClientControlled()

bool Unit::IsClientControlled ( Player const *  exactClient = nullptr) const
21440{
21441 // Severvide method to check if unit is client controlled (optionally check for specific client in control)
21442
21443 // Applies only to player controlled units
21445 return false;
21446
21447 // These flags are meant to be used when server controls this unit, client control is taken away
21449 return false;
21450
21451 // If unit is possessed, it has lost original control...
21452 if (ObjectGuid const& guid = GetCharmerGUID())
21453 {
21454 // ... but if it is a possessing charm, then we have to check if some other player controls it
21455 if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_POSSESSED) && guid.IsPlayer())
21456 return (exactClient ? (exactClient->GetGUID() == guid) : true);
21457 return false;
21458 }
21459
21460 // By default: players have client control over themselves
21461 if (IsPlayer())
21462 return (exactClient ? (exactClient == this) : true);
21463 return false;
21464}
@ UNIT_FLAG_CONFUSED
Definition UnitDefines.h:276
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:256
@ UNIT_FLAG_FLEEING
Definition UnitDefines.h:277

References GetCharmerGUID(), Object::GetGUID(), Object::HasFlag(), Object::IsPlayer(), UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_FLEEING, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_FLAG_POSSESSED.

Referenced by GetClientControlling(), SetCanFly(), SetDisableGravity(), SetFeatherFall(), SetHover(), SetSpeed(), and SetWaterWalking().

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
1015 {
1016 if (FactionTemplateEntry const* entry = GetFactionTemplateEntry())
1017 return entry->IsContestedGuardFaction();
1018
1019 return false;
1020 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1293{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsCrowdControlled()

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
2045{
2046 // only physical spells damage gets reduced by armor
2047 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
2048 return false;
2049 if (spellInfo)
2050 {
2051 // there are spells with no specific attribute but they have "ignores armor" in tooltip
2052 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
2053 return false;
2054
2055 // bleeding effects are not reduced by armor
2056 if (effIndex != MAX_SPELL_EFFECTS)
2057 {
2058 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2059 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2060 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2061 return false;
2062 }
2063 }
2064 return true;
2065}
@ MECHANIC_BLEED
Definition SharedDefines.h:1351
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition SpellInfo.h:191

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline

References Corpse, Dead, and m_deathState.

Referenced by npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1774{ return (m_deathState == DeathState::JustDied); };

References JustDied, and m_deathState.

Referenced by Creature::IsInvisibleDueToDespawn().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline

◆ IsFalling()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10421{
10422 return GetReactionTo(unit) >= REP_FRIENDLY;
10423}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline
@ UNIT_NPC_FLAG_GOSSIP
Definition UnitDefines.h:319

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition UnitDefines.h:337

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHighestExclusiveAura()

bool Unit::IsHighestExclusiveAura ( Aura const *  aura,
bool  removeOtherAuraApplications = false 
)
4435{
4436 for (uint32 i = 0 ; i < MAX_SPELL_EFFECTS; ++i)
4437 if (AuraEffect const* aurEff = aura->GetEffect(i))
4438 if (!IsHighestExclusiveAuraEffect(aura->GetSpellInfo(), aurEff->GetAuraType(), aurEff->GetAmount(), aura->GetEffectMask(), removeOtherAuraApplications))
4439 return false;
4440
4441 return true;
4442}
bool IsHighestExclusiveAuraEffect(SpellInfo const *spellInfo, AuraType auraType, int32 effectAmount, uint8 auraEffectMask, bool removeOtherAuraApplications=false)
Definition Unit.cpp:4444

References Aura::GetEffect(), Aura::GetEffectMask(), Aura::GetSpellInfo(), IsHighestExclusiveAuraEffect(), and MAX_SPELL_EFFECTS.

Referenced by _RemoveNoStackAurasDueToAura().

◆ IsHighestExclusiveAuraEffect()

bool Unit::IsHighestExclusiveAuraEffect ( SpellInfo const *  spellInfo,
AuraType  auraType,
int32  effectAmount,
uint8  auraEffectMask,
bool  removeOtherAuraApplications = false 
)
4445{
4446 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
4447 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end();)
4448 {
4449 AuraEffect const* existingAurEff = (*itr);
4450 ++itr;
4451
4452 if (sSpellMgr->CheckSpellGroupStackRules(spellInfo, existingAurEff->GetSpellInfo()) == SPELL_GROUP_STACK_RULE_EXCLUSIVE_HIGHEST)
4453 {
4454 int32 diff = abs(effectAmount) - abs(existingAurEff->GetAmount());
4455 if (!diff)
4456 for (int32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4457 diff += int32((auraEffectMask & (1 << i)) >> i) - int32((existingAurEff->GetBase()->GetEffectMask() & (1 << i)) >> i);
4458
4459 if (diff > 0)
4460 {
4461 Aura const* base = existingAurEff->GetBase();
4462 // no removing of area auras from the original owner, as that completely cancels them
4463 if (removeOtherAuraApplications && (!base->IsArea() || base->GetOwner() != this))
4464 {
4465 if (AuraApplication* aurApp = existingAurEff->GetBase()->GetApplicationOfTarget(GetGUID()))
4466 {
4467 bool hasMoreThanOneEffect = base->HasMoreThanOneEffectForType(auraType);
4468 uint32 removedAuras = m_removedAurasCount;
4469 RemoveAura(aurApp);
4470 if (hasMoreThanOneEffect || m_removedAurasCount > removedAuras)
4471 itr = auras.begin();
4472 }
4473 }
4474 }
4475 else if (diff < 0)
4476 return false;
4477 }
4478 }
4479
4480 return true;
4481}
@ SPELL_GROUP_STACK_RULE_EXCLUSIVE_HIGHEST
Definition SpellMgr.h:368
bool HasMoreThanOneEffectForType(AuraType auraType) const
Definition SpellAuras.cpp:1014
bool IsArea() const
Definition SpellAuras.cpp:1024

References AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraEffect::GetBase(), Aura::GetEffectMask(), Object::GetGUID(), Aura::GetOwner(), AuraEffect::GetSpellInfo(), Aura::HasMoreThanOneEffectForType(), Aura::IsArea(), m_removedAurasCount, MAX_SPELL_EFFECTS, RemoveAura(), SPELL_GROUP_STACK_RULE_EXCLUSIVE_HIGHEST, and sSpellMgr.

Referenced by IsHighestExclusiveAura().

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10426{
10427 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10428 if (!my_faction || !my_faction->faction)
10429 return false;
10430
10431 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10432 if (raw_faction && raw_faction->reputationListID >= 0)
10433 return false;
10434
10435 return my_faction->IsHostileToPlayers();
10436}
int32 reputationListID
Definition DBCStructure.h:909
uint32 faction
Definition DBCStructure.h:941
bool IsHostileToPlayers() const
Definition DBCStructure.h:981

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

bool Unit::IsHovering ( ) const
inline

◆ IsHunterPet()

◆ IsImmobilizedState()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12962{
12963 SpellInfo const* spellInfo = spell->GetSpellInfo();
12964 if (!spellInfo)
12965 {
12966 return false;
12967 }
12968
12970 {
12971 return false;
12972 }
12973
12975 {
12976 return false;
12977 }
12978
12979 uint32 schoolMask = spell->GetSpellSchoolMask();
12980 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12981 {
12982 return false;
12983 }
12984
12985 // If m_immuneToDamage type contain magic, IMMUNE damage.
12986 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12987 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12988 {
12989 if ((itr->type & schoolMask) == schoolMask)
12990 {
12991 return true;
12992 }
12993 }
12994
12995 return false;
12996}
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition SharedDefines.h:493
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition SharedDefines.h:446
@ IMMUNITY_DAMAGE
Definition SharedDefines.h:1408
@ SPELL_SCHOOL_MASK_NONE
Definition SharedDefines.h:307
std::vector< SpellImmune > SpellImmuneList
Definition SpellDefines.h:182

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12930{
12931 if (!spellInfo)
12932 {
12933 return false;
12934 }
12935
12936 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12937 {
12938 return false;
12939 }
12940
12941 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12942 {
12943 return false;
12944 }
12945
12946 uint32 schoolMask = spellInfo->GetSchoolMask();
12947 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12948 {
12949 return false;
12950 }
12951
12952 // If m_immuneToDamage type contain magic, IMMUNE damage.
12953 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12954 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12955 if ((itr->type & schoolMask) == schoolMask)
12956 return true;
12957
12958 return false;
12959}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12914{
12915 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12916 {
12917 return false;
12918 }
12919
12920 // If m_immuneToDamage type contain magic, IMMUNE damage.
12921 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12922 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12923 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12924 return true;
12925
12926 return false;
12927}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by boss_gurtogg_bloodboil::CanAIAttack(), Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
13078{
13079 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
13080}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12998
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12913

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
13038{
13039 SpellInfo const* spellInfo = spell->GetSpellInfo();
13041 {
13042 return false;
13043 }
13044
13045 uint32 schoolMask = spell->GetSpellSchoolMask();
13046 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
13047 {
13048 return false;
13049 }
13050
13051 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13052 {
13053 // If m_immuneToSchool type contain this school type, IMMUNE damage.
13054 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13055 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13056 {
13057 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
13058 {
13059 return true;
13060 }
13061 }
13062 }
13063
13064 return false;
13065}
@ IMMUNITY_SCHOOL
Definition SharedDefines.h:1407
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition SpellInfo.cpp:1323

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
13015{
13016 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13017 return false;
13018
13019 uint32 schoolMask = spellInfo->GetSchoolMask();
13020 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
13021 {
13022 return false;
13023 }
13024
13025 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13026 {
13027 // If m_immuneToSchool type contain this school type, IMMUNE damage.
13028 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13029 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13030 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
13031 return true;
13032 }
13033
13034 return false;
13035}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12999{
13000 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
13001 {
13002 return false;
13003 }
13004
13005 // If m_immuneToSchool type contain this school type, IMMUNE damage.
13006 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13007 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13008 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
13009 return true;
13010
13011 return false;
13012}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), IsImmunedToDamageOrSchool(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

13083{
13084 if (!spellInfo)
13085 return false;
13086
13087 // Single spell immunity.
13088 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
13089 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
13090 if (itr->type == spellInfo->Id)
13091 return true;
13092
13093 // xinef: my special immunity, if spellid is not on this list it means npc is immune
13094 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
13095 if (!allowIdList.empty())
13096 {
13097 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
13098 if (itr->type == spellInfo->Id)
13099 return false;
13100 return true;
13101 }
13102
13103 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13104 return false;
13105
13106 if (spellInfo->Dispel)
13107 {
13108 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
13109 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
13110 if (itr->type == spellInfo->Dispel)
13111 return true;
13112 }
13113
13114 // Spells that don't have effectMechanics.
13115 if (spellInfo->Mechanic)
13116 {
13117 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13118 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13119 if (itr->type == spellInfo->Mechanic)
13120 return true;
13121 }
13122
13123 bool immuneToAllEffects = true;
13124 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13125 {
13126 // State/effect immunities applied by aura expect full spell immunity
13127 // Ignore effects with mechanic, they are supposed to be checked separately
13128 if (!spellInfo->Effects[i].IsEffect())
13129 continue;
13130
13131 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
13132 if (IsImmunedToSpellEffect(spellInfo, i))
13133 {
13134 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
13135 return true;
13136 continue;
13137 }
13138
13139 immuneToAllEffects = false;
13140 break;
13141 }
13142 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
13143 return true;
13144
13145 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13146 {
13147 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
13148 if (spell)
13149 {
13150 spellSchoolMask = spell->GetSpellSchoolMask();
13151 }
13152
13153 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
13154 {
13155 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13156 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13157 {
13158 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
13159 if (((itr->type & spellSchoolMask) == spellSchoolMask)
13160 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
13161 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
13162 {
13163 return true;
13164 }
13165 }
13166 }
13167 }
13168
13169 return false;
13170}
@ IMMUNITY_ALLOW_ID
Definition SharedDefines.h:1412
@ IMMUNITY_ID
Definition SharedDefines.h:1411
@ IMMUNITY_MECHANIC
Definition SharedDefines.h:1410

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

13173{
13174 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
13175 return false;
13176
13177 // xinef: pet scaling auras
13178 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
13179 return false;
13180
13181 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13182 return false;
13183
13184 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13185 uint32 effect = spellInfo->Effects[index].Effect;
13186 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13187 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13188 {
13189 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13190 {
13191 return true;
13192 }
13193 }
13194
13195 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13196 {
13197 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13198 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13199 if (itr->type == mechanic)
13200 return true;
13201 }
13202
13203 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13204 {
13206 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13207 {
13208 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13209 {
13210 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13211 {
13212 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13213 {
13214 return true;
13215 }
13216 }
13217 }
13218 }
13219
13220 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13221 {
13222 // Check for immune to application of harmful magical effects
13224 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13225 {
13226 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13227 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13228 !spellInfo->IsPositiveEffect(index) && // Harmful
13229 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13230 {
13231 return true;
13232 }
13233 }
13234 }
13235 }
13236
13237 return false;
13238}
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition SharedDefines.h:816
@ SPELL_ATTR3_ALWAYS_HIT
Definition SharedDefines.h:522
@ IMMUNITY_STATE
Definition SharedDefines.h:1406
@ IMMUNITY_EFFECT
Definition SharedDefines.h:1405
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition SharedDefines.h:566
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition SpellAuraDefines.h:330
@ SPELL_BLOCK_TYPE_ALL
Definition SpellDefines.h:159
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition Unit.cpp:21324

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
915{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4250{
4251 if (c->GetMapId() == MAP_THE_RING_OF_VALOR)
4252 {
4253 // skip transport check, check for being below floor level
4254 if (this->GetPositionZ() < 28.0f)
4255 return false;
4256 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4257 if (Battleground* bg = bgMap->GetBG())
4258 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4259 return false;
4260 }
4261 else if (c->GetMapId() == MAP_ICECROWN_CITADEL)
4262 {
4263 // if static transport doesn't match - return false
4264 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4265 return false;
4266
4267 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4268 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4269 {
4270 if (c->GetTransport() != this->GetTransport())
4271 return false;
4272 if (this->GetTransport())
4273 {
4274 if (c->GetPositionY() < 2033.0f)
4275 {
4276 if (this->GetPositionY() > 2033.0f)
4277 return false;
4278 }
4279 else if (c->GetPositionY() < 2438.0f)
4280 {
4281 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4282 return false;
4283 }
4284 else if (this->GetPositionY() < 2438.0f)
4285 return false;
4286 }
4287 }
4288 }
4289 else
4290 {
4291 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4292 if (c->GetTransport() != this->GetTransport())
4293 return false;
4294 }
4295
4296 LiquidStatus liquidStatus = GetLiquidData().Status;
4297 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4298
4299 // In water or jumping in water
4300 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4301 {
4302 return c->CanEnterWater();
4303 }
4304 else
4305 {
4306 return c->CanWalk() || c->CanFly();
4307 }
4308}
@ MAP_THE_RING_OF_VALOR
Definition AreaDefines.h:262
@ MAP_ICECROWN_CITADEL
Definition AreaDefines.h:266
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition GridTerrainData.h:32
LiquidStatus
Definition GridTerrainData.h:190
@ LIQUID_MAP_ABOVE_WATER
Definition GridTerrainData.h:192
Definition Map.h:680
BattlegroundMap * ToBattlegroundMap()
Definition Map.h:380
bool IsFalling() const
Definition Unit.cpp:19927
LiquidData const & GetLiquidData() const
Definition Object.cpp:3089
LiquidStatus Status
Definition GridTerrainData.h:206

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_ICECROWN_CITADEL, MAP_LIQUID_STATUS_IN_CONTACT, MAP_THE_RING_OF_VALOR, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_dred_raptor_call::HandleDummy(), spell_mc_play_dead_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), spell_chapter5_return_to_capital::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), Creature::IsUpdateNeeded(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::boss_anubrekhanAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), npc_kiljaeden_controller::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), boss_muru::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_alar::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), BossAI::OnSpellCastFinished(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_kiljaeden::Reset(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
21131{
21132 // Check target exists
21133 if (!who)
21134 return false;
21135 // Search in threat list
21136 ObjectGuid guid = who->GetGUID();
21137 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
21138 {
21139 HostileReference* ref = (*i);
21140 // Return true if the unit matches
21141 if (ref && ref->getUnitGuid() == guid)
21142 return true;
21143 }
21144 // Nothing found, false.
21145 return false;
21146}
Definition ThreatMgr.h:48
ObjectGuid getUnitGuid() const
Definition ThreatMgr.h:106
ThreatContainer::StorageType const & GetThreatList() const
Definition ThreatMgr.h:273

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21360{
21361 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21362 {
21363 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21364 {
21365 return false;
21366 }
21367 }
21368
21369 if (ShapeshiftForm form = GetShapeshiftForm())
21370 {
21371 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21372 if (!shapeshift)
21373 {
21374 return true;
21375 }
21376
21377 if (!(shapeshift->flags1 & SHAPESHIFT_FLAG_STANCE))
21378 {
21379 return true;
21380 }
21381 }
21382
21384 {
21385 return false;
21386 }
21387
21388 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21389 if (!display)
21390 {
21391 return true;
21392 }
21393
21395 if (!displayExtra)
21396 {
21397 return true;
21398 }
21399
21400 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21401 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21402
21403 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21404 {
21405 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21406 {
21407 return true;
21408 }
21409 }
21410
21411 return false;
21412}
@ CHRRACES_FLAGS_CAN_MOUNT
Definition DBCStructure.h:675
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition DBCStructure.h:771
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition SharedDefines.h:417
@ SHAPESHIFT_FLAG_STANCE
Definition UnitDefines.h:104
uint32 getTransForm() const
Definition Unit.h:1947
bool HasFlag(ChrRacesFlags flag) const
Definition DBCStructure.h:700
uint32 ExtendedDisplayInfoID
Definition DBCStructure.h:725
uint32 DisplayRaceID
Definition DBCStructure.h:741
bool HasFlag(CreatureModelDataFlags flag) const
Definition DBCStructure.h:804
uint32 flags1
Definition DBCStructure.h:1820

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftFormEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SHAPESHIFT_FLAG_STANCE, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftFormStore.

Referenced by Player::ActivateTaxiPathTo(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

References HasUnitState(), and UNIT_STATE_IN_FLIGHT.

Referenced by Player::CheckAreaExploreAndOutdoor(), Spell::CheckCast(), SpellInfo::CheckTarget(), CreatureUnitRelocationWorker(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), go_commandscript::DoTeleport(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectLeap(), Spell::EffectStuck(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), Player::GetNPCIfCanInteractWith(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLogoutRequestOpcode(), Battlefield::HandlePlayerEnterZone(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnstuckCommand(), Battlefield::InvitePlayerToWar(), Player::IsFalling(), Player::IsOutdoorPvPActive(), IsValidCombatTarget(), item_only_for_flight::OnUse(), WorldSession::ProcessMovementInfo(), Player::ProcessTerrainStatusUpdate(), SetStunned(), Player::TeleportTo(), and Player::UpdatePvPState().

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4240{
4241 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4242}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition UnitDefines.h:335

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
19022{
19023 if (this == unit)
19024 return true;
19025
19026 Unit const* u1 = GetCharmerOrOwnerOrSelf();
19027 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
19028 if (u1 == u2)
19029 return true;
19030
19031 if (u1->IsPlayer() && u2->IsPlayer())
19032 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
19033 // Xinef: we assume that npcs with the same faction are in party
19034 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
19035 return u1->GetFaction() == u2->GetFaction();
19036 // Xinef: creature type_flag should work for party check only if player group is not a raid
19039 return true;
19040 else
19041 return false;
19042}
bool isRaidGroup() const
Definition Group.cpp:2281
bool IsInSameGroupWith(Player const *p) const
Definition Player.cpp:2302

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameGroupWith(), Object::IsPlayer(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
19045{
19046 if (this == unit)
19047 return true;
19048
19049 Unit const* u1 = GetCharmerOrOwnerOrSelf();
19050 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
19051 if (u1 == u2)
19052 return true;
19053
19054 if (u1->IsPlayer() && u2->IsPlayer())
19055 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
19056 // Xinef: we assume that npcs with the same faction are in party
19057 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
19058 return u1->GetFaction() == u2->GetFaction();
19061 return true;
19062 else
19063 return false;
19064}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameRaidWith(), Object::IsPlayer(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by Corpse::BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), and PatchValuesUpdate().

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4216{
4217 // can always move when not casting
4219 {
4220 return false;
4221 }
4222
4223 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4225 {
4226 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4227 {
4228 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4229 {
4230 return false;
4231 }
4232 }
4233 }
4234
4235 // prohibit movement for all other spell casts
4236 return true;
4237}
@ UNIT_STATE_CASTING
Definition UnitDefines.h:185

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10439{
10440 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10441 if (!my_faction || !my_faction->faction)
10442 return true;
10443
10444 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10445 if (raw_faction && raw_faction->reputationListID >= 0)
10446 return false;
10447
10448 return my_faction->IsNeutralToAll();
10449}
bool IsNeutralToAll() const
Definition DBCStructure.h:982

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4147{
4148 // We don't do loop here to explicitly show that melee spell is excluded.
4149 // Maybe later some special spells will be excluded too.
4150
4151 // generic spells are cast when they are not finished and not delayed
4154 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4155 {
4156 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4157 {
4158 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4159 return true;
4160 }
4161 }
4162 // channeled spells may be delayed, but they are still considered cast
4163 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4165 {
4166 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4167 return true;
4168 }
4169 // autorepeat spells may be finished or delayed, but they are still considered cast
4170 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4171 return true;
4172
4173 return false;
4174}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition SharedDefines.h:484

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), Player::CanExecutePendingSpellCastRequest(), CombatStop(), npc_molten_golem::DamageTaken(), ScriptedAI::DoCastSpell(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
787{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition UnitDefines.h:160

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), DealDamage(), MotionTransport::DelayedTeleportTransport(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), UpdateSpeed(), and UpdateSplinePosition().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17581{
17582 Unit* owner = GetOwner();
17583
17584 if (!owner || !owner->IsPlayer())
17585 return false;
17586
17587 // if the owner has that pet aura, return true
17588 for (PetAura const* petAura : owner->m_petAuras)
17589 if (petAura->GetAura(GetEntry()) == aura->GetId())
17590 return true;
17591
17592 return false;
17593}
Definition SpellMgr.h:462
uint32 GetId(std::string const &username)
Definition AccountMgr.cpp:236

References Object::GetEntry(), Aura::GetId(), GetOwner(), Object::IsPlayer(), and m_petAuras.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16974{
16975 uint32 transformId = getTransForm();
16976 if (!transformId)
16977 return false;
16978
16979 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16980 if (!spellInfo)
16981 return false;
16982
16983 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16984}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition SpellInfo.cpp:2029

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1299 {
1300 if (Unit* u = GetCharm())
1301 return u->isPossessed();
1302 else
1303 return false;
1304 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1305{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition Unit.h:1296

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:320

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsRooted()

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5952{
5954 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5955 {
5956 if ((*i)->GetMiscValue() == script)
5957 if ((*i)->IsAffectedOnSpell(spell))
5958 return (*i);
5959 }
5960 return nullptr;
5961}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16935{
16936 uint8 s = getStandState();
16937 return
16941}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition UnitDefines.h:34

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3139{
3140 // These spells can't be blocked
3141 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3142 return false;
3143
3144 if (victim->HasIgnoreHitDirectionAura() || victim->HasInArc(M_PI, this))
3145 {
3146 // Check creatures flags_extra for disable block
3147 if (victim->IsCreature() &&
3149 return false;
3150
3151 float blockChance = victim->GetUnitBlockChance();
3152 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3153
3154 // xinef: cant block while casting or while stunned
3155 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3156 blockChance = 0.0f;
3157
3158 if (roll_chance_f(blockChance))
3159 return true;
3160 }
3161 return false;
3162}
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition CreatureData.h:49
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition SharedDefines.h:414
@ UNIT_STATE_CONTROLLED
Definition UnitDefines.h:215
bool HasIgnoreHitDirectionAura() const
Definition Unit.h:1792
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition Unit.cpp:3815
float GetUnitBlockChance() const
Definition Unit.cpp:3731

References CREATURE_FLAG_EXTRA_NO_BLOCK, GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), Object::IsCreature(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, Object::ToCreature(), and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStandUpOnMovementState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline
1742{ return !(HasUnitState(UNIT_STATE_MOVING)); }
@ UNIT_STATE_MOVING
Definition UnitDefines.h:214

References HasUnitState(), and UNIT_STATE_MOVING.

Referenced by RotateMovementGenerator::Initialize(), IdleMovementGenerator::Reset(), and SetFacingToObject().

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition UnitDefines.h:156

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), InstanceScript::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), ToTempSummon(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17668{
17669 SpellInfo const* spellProto = aura->GetSpellInfo();
17670 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17671
17672 // let the aura be handled by new proc system if it has new entry
17673 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17674 return false;
17675
17676 // Get proc Event Entry
17677 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17678
17679 // Get EventProcFlag
17680 uint32 EventProcFlag;
17681 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17682 EventProcFlag = spellProcEvent->procFlags;
17683 else
17684 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17685 // Continue if no trigger exist
17686 if (!EventProcFlag)
17687 return false;
17688
17689 // Additional checks for triggered spells (ignore trap casts)
17690 if (eventInfo.GetHitMask() & PROC_EX_INTERNAL_TRIGGERED && !(EventProcFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17691 {
17693 return false;
17694 }
17695
17696 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17697 // Xinef: skip victim auras
17698 // Excluded player shoot spells
17699 // Excluded player item spells
17700 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17701 {
17702 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17703 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17704 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17705 {
17706 return false;
17707 }
17708 }
17709
17710 // Check spellProcEvent data requirements
17711 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17712 return false;
17713 // In most cases req get honor or XP from kill
17714 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17715 {
17716 bool allow = false;
17717
17718 if (victim)
17719 allow = ToPlayer()->isHonorOrXPTarget(victim);
17720
17721 // Shadow Word: Death - can trigger from every kill
17722 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17723 allow = true;
17724 if (!allow)
17725 return false;
17726 }
17727 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17728 // But except periodic and kill triggers (can triggered from self)
17729 if (procSpell && procSpell->Id == spellProto->Id
17730 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17731 return false;
17732
17733 // Check if current equipment allows aura to proc
17734 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17735 {
17736 Player* player = ToPlayer();
17737 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17738 {
17739 Item* item = nullptr;
17740 if (attType == BASE_ATTACK)
17742 else if (attType == OFF_ATTACK)
17744 else
17746
17747 if (player->IsInFeralForm())
17748 return false;
17749
17750 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17751 return false;
17752 }
17753 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17754 {
17755 // Check if player is wearing shield
17757 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17758 return false;
17759 }
17760 }
17761 // Get chance from spell
17762 float chance = float(spellProto->ProcChance);
17763 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17764 if (spellProcEvent && spellProcEvent->customChance)
17765 chance = spellProcEvent->customChance;
17766 // If PPM exist calculate chance from PPM
17767 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17768 {
17769 uint32 attackSpeed = 0;
17770 Unit* attacker = nullptr;
17771 if (!isVictim)
17772 attacker = this;
17773 else if (victim)
17774 attacker = victim;
17775
17776 if (attacker)
17777 {
17778 if (!procSpell || procSpell->DmgClass == SPELL_DAMAGE_CLASS_MELEE || procSpell->IsRangedWeaponSpell())
17779 {
17780 attackSpeed = attacker->GetAttackTime(attType);
17781 }
17782 else //spells user their casttime for ppm calculations
17783 {
17784 if (procSpell->CastTimeEntry)
17785 attackSpeed = procSpell->CastTimeEntry->CastTime;
17786
17787 //instants and fast spells use 1.5s castspeed
17788 if (attackSpeed < 1500)
17789 attackSpeed = 1500;
17790 }
17791 }
17792 chance = GetPPMProcChance(attackSpeed, spellProcEvent->ppmRate, spellProto);
17793 }
17794
17795 // Custom chances
17796 switch (spellProto->SpellFamilyName)
17797 {
17799 {
17800 // Recklessness, allow to proc only once for whirlwind
17801 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17802 return false;
17803 }
17804 }
17805
17806 if (eventInfo.GetProcChance())
17807 {
17808 chance = *eventInfo.GetProcChance();
17809 }
17810
17811 // Apply chance modifer aura
17812 if (Player* modOwner = GetSpellModOwner())
17813 {
17814 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17815 }
17816
17817 return roll_chance_f(chance);
17818}
@ ITEM_CLASS_ARMOR
Definition ItemTemplate.h:295
@ ITEM_CLASS_WEAPON
Definition ItemTemplate.h:293
@ EQUIPMENT_SLOT_RANGED
Definition Player.h:687
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition SharedDefines.h:505
@ SPELL_ATTR3_CAN_PROC_FROM_PROCS
Definition SharedDefines.h:530
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition SpellDefines.h:94
@ PROC_EX_INTERNAL_TRIGGERED
Definition SpellMgr.h:220
@ PROC_FLAG_DEATH
Definition SpellMgr.h:142
@ PROC_FLAG_TAKEN_PERIODIC
Definition SpellMgr.h:134
@ PROC_FLAG_KILL
Definition SpellMgr.h:107
@ PROC_FLAG_DONE_TRAP_ACTIVATION
Definition SpellMgr.h:137
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition Player.h:1250
bool isHonorOrXPTarget(Unit *victim) const
Definition Player.cpp:12714
uint32 GetCategory() const
Definition SpellInfo.cpp:871
uint32 ProcFlags
Definition SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition SpellInfo.h:376
SpellCastTimesEntry const * CastTimeEntry
Definition SpellInfo.h:347
uint32 DmgClass
Definition SpellInfo.h:389
bool IsRangedWeaponSpell() const
Definition SpellInfo.cpp:1276
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition Unit.cpp:13600
uint32 Class
Definition ItemTemplate.h:621
int32 CastTime
Definition DBCStructure.h:1758

References BASE_ATTACK, SpellCastTimesEntry::CastTime, SpellInfo::CastTimeEntry, ItemTemplate::Class, SpellProcEventEntry::customChance, SpellInfo::DmgClass, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), ProcEventInfo::GetHitMask(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_EX_INTERNAL_TRIGGERED, PROC_FLAG_DEATH, PROC_FLAG_DONE_TRAP_ACTIVATION, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_CAN_PROC_FROM_PROCS, SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELL_DAMAGE_CLASS_MELEE, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4401{
4403}
@ LIQUID_MAP_UNDER_WATER
Definition GridTerrainData.h:195

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
14168{
14169 return _IsValidAssistTarget(target, nullptr);
14170}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition Unit.cpp:14173

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
14030{
14031 return _IsValidAttackTarget(target, bySpell);
14032}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

bool Unit::IsVehicle ( ) const
inline

References m_unitTypeMask, and UNIT_MASK_VEHICLE.

Referenced by Battleground::AddCreature(), Creature::AddToWorld(), ApplyResilience(), CanHaveThreatList(), spell_wintergrasp_water::CheckCast(), Spell::CheckEffectTarget(), SpellInfo::CheckTarget(), Map::CreatureRelocation(), DealDamage(), DealMeleeDamage(), MotionTransport::DelayedTeleportTransport(), Spell::EffectDummy(), Spell::EffectKnockBack(), Spell::EffectSummonType(), CreatureAI::EnterEvadeMode(), SmartScript::GetTargets(), GetVelocity(), AuraEffect::HandleAuraControlVehicle(), debug_commandscript::HandleDebugEnterVehicleCommand(), debug_commandscript::HandleDebugSetVehicleIdCommand(), spell_q13280_13283_plant_battle_standard::HandleDummy(), BattlefieldWG::HandleKill(), BattlegroundIC::HandleKillUnit(), WorldSession::HandlePetActionHelper(), spell_q12919_gymers_throw::HandleScript(), spell_putricide_mutated_transformation::HandleSummon(), TempSummon::InitStats(), KillRewarder::KillRewarder(), spell_igb_overheat_aura::Load(), MagicSpellHitResult(), npc_brann_radio::npc_brann_radioAI::MoveInLineOfSight(), BattlefieldWG::OnUnitDeath(), OutDebugInfo(), VehicleAI::Permissible(), Map::PlayerRelocation(), SmartScript::ProcessAction(), RemoveCharmedBy(), RemoveFromWorld(), Spell::SelectImplicitCasterObjectTargets(), SetCharmedBy(), SetOwnerGUID(), SetSpeed(), Player::StopCastingCharm(), Map::SummonCreature(), UpdateCharmAI(), Creature::UpdateEntry(), UpdateHeight(), UpdateOrientation(), and UpdateSpeed().

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition Common.h:57
@ SERVERSIDE_VISIBILITY_GM
Definition SharedDefines.h:1284
T_VALUES GetValue(FLAG_TYPE flag) const
Definition Object.h:393

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinBoundaryRadius()

bool Unit::IsWithinBoundaryRadius ( const Unit obj) const
705{
706 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
707 return false;
708
709 float objBoundaryRadius = std::max(obj->GetBoundaryRadius(), MIN_MELEE_REACH);
710
711 return IsInDist(obj, objBoundaryRadius);
712}
float GetBoundaryRadius() const
Definition Unit.h:866
bool IsInDist(float x, float y, float z, float dist) const
Definition Position.h:221

References GetBoundaryRadius(), WorldObject::InSamePhase(), Position::IsInDist(), WorldObject::IsInMap(), and MIN_MELEE_REACH.

Referenced by Spell::CheckRange(), Acore::WorldObjectSpellConeTargetCheck::operator()(), and Player::Update().

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
666{
667 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
668 return false;
669
670 float dx = GetPositionX() - obj->GetPositionX();
671 float dy = GetPositionY() - obj->GetPositionY();
672 float dz = GetPositionZ() - obj->GetPositionZ();
673 float distsq = dx * dx + dy * dy + dz * dz;
674
675 float maxdist = dist + GetMeleeRange(obj);
676
677 if ((IsPlayer() || obj->IsPlayer()) && HasLeewayMovement() && obj->HasLeewayMovement())
678 maxdist += LEEWAY_BONUS_RANGE;
679
680 return distsq < maxdist * maxdist;
681}
#define LEEWAY_BONUS_RANGE
Definition ObjectDefines.h:51
bool HasLeewayMovement() const
Definition Unit.h:1709

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasLeewayMovement(), WorldObject::InSamePhase(), WorldObject::IsInMap(), Object::IsPlayer(), and LEEWAY_BONUS_RANGE.

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_murmur::CanAIAttack(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), SmartAI::DistanceYourself(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), ChaseMovementGenerator< T >::DoUpdate(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_overlord_drakuru_betrayal::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessEvent(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
690{
691 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
692 {
693 return false;
694 }
695
696 auto dx = GetPositionX() - obj->GetPositionX();
697 auto dy = GetPositionY() - obj->GetPositionY();
698 auto dz = GetPositionZ() - obj->GetPositionZ();
699 auto distsq = dx * dx + dy * dy + dz * dz;
700
701 return distsq <= dist * dist;
702}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim(), npc_sunblade_scout::JustEngagedWith(), and npc_amanishi_scout::JustEngagedWith().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19503{
19504 float angle = forward ? 0 : M_PI;
19505 if (IsCreature())
19506 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19507 else
19508 {
19509 float vcos = cos(angle + GetOrientation());
19510 float vsin = std::sin(angle + GetOrientation());
19511
19512 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19513 data << GetPackGUID();
19514 data << uint32(0); // Sequence
19515 data << float(vcos); // x direction
19516 data << float(vsin); // y direction
19517 data << float(speedXY); // Horizontal speed
19518 data << float(-speedZ); // Z Movement speed (vertical)
19519
19520 ToPlayer()->SendDirectMessage(&data);
19521 }
19522}
void MoveJumpTo(float angle, float speedXY, float speedZ)
The unit will jump in a specific direction.
Definition MotionMaster.cpp:636
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5762
@ SMSG_MOVE_KNOCK_BACK
Definition Opcodes.h:269

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Object::IsCreature(), MotionMaster::MoveJumpTo(), Player::SendDirectMessage(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19525{
19526 float x, y, z;
19527 obj->GetContactPoint(this, x, y, z);
19528 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19529 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19530}
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition MotionMaster.h:254
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition Object.cpp:2753

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17961{
17962 // Prevent killing unit twice (and giving reward from kill twice)
17963 if (!victim->GetHealth())
17964 return;
17965
17966 if (killer && !killer->IsInMap(victim))
17967 killer = nullptr;
17968
17969 // find player: owner of controlled `this` or `this` itself maybe
17970 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17971 Creature* creature = victim->ToCreature();
17972
17973 bool isRewardAllowed = true;
17974 if (creature)
17975 {
17976 isRewardAllowed = (creature->IsDamageEnoughForLootingAndReward() && !creature->IsLootRewardDisabled());
17977 if (!isRewardAllowed)
17978 creature->SetLootRecipient(nullptr);
17979 }
17980
17981 // pussywizard: remade this if section (player is on the same map
17982 if (isRewardAllowed && creature)
17983 {
17984 Player* lr = creature->GetLootRecipient();
17985 if (lr && lr->IsInMap(creature))
17986 player = creature->GetLootRecipient();
17987 else if (Group* lrg = creature->GetLootRecipientGroup())
17988 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17989 if (Player* member = itr->GetSource())
17990 if (member->IsAtLootRewardDistance(creature))
17991 {
17992 player = member;
17993 break;
17994 }
17995 }
17996
17997 // Exploit fix
17998 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17999 isRewardAllowed = false;
18000
18001 // Reward player, his pets, and group/raid members
18002 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
18003 if (isRewardAllowed && player && player != victim)
18004 {
18005 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
18006 data << player->GetGUID(); // player with killing blow
18007 data << victim->GetGUID(); // victim
18008
18009 Player* looter = player;
18010 Group* group = player->GetGroup();
18011 bool hasLooterGuid = false;
18012
18013 if (group)
18014 {
18015 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
18016
18017 if (creature)
18018 {
18019 group->UpdateLooterGuid(creature, true);
18020 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
18021 {
18022 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
18023 if (looter)
18024 {
18025 hasLooterGuid = true;
18026 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
18027 }
18028 }
18029 }
18030 }
18031 else
18032 {
18033 player->SendDirectMessage(&data);
18034
18035 if (creature)
18036 {
18037 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
18038 data2 << creature->GetGUID();
18039 data2 << uint8(0); // unk1
18040 data2 << uint8(0); // no group looter
18041 player->SendMessageToSet(&data2, true);
18042 }
18043 }
18044
18045 // Generate loot before updating looter
18046 if (creature)
18047 {
18048 Loot* loot = &creature->loot;
18049 loot->clear();
18050
18051 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
18052 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
18053
18054 if (creature->GetLootMode())
18056
18057 if (group)
18058 {
18059 if (hasLooterGuid)
18060 group->SendLooter(creature, looter);
18061 else
18062 group->SendLooter(creature, nullptr);
18063
18064 // Update round robin looter only if the creature had loot
18065 if (!creature->loot.empty())
18066 group->UpdateLooterGuid(creature);
18067 }
18068 }
18069
18070 player->RewardPlayerAndGroupAtKill(victim, false);
18071 }
18072
18073 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
18074 if (killer && (killer->IsPet() || killer->IsTotem()))
18075 if (Unit* owner = killer->GetOwner())
18076 {
18077 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
18078 sScriptMgr->OnPlayerCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
18079 }
18080
18081 if (killer != victim)
18082 {
18083 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
18084 }
18085
18086 // Proc auras on death - must be before aura/combat remove
18087 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
18088
18089 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
18090 // and before Spirit of Redemption as it also removes auras
18091 if (killer)
18092 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
18093 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
18094
18095 // Spirit of Redemption
18096 // if talent known but not triggered (check priest class for speedup check)
18097 bool spiritOfRedemption = false;
18099 {
18100 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
18101 {
18102 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
18103 if (victim->HasSpiritOfRedemptionAura() || victim->HasAura(27827))
18104 {
18105 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
18106 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
18107 victim->GetPositionY(), victim->GetPositionZ());
18108
18109 ACE_Stack_Trace trace(0, 50);
18110 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
18111 }
18112 else
18113 {
18114 // save value before aura remove
18115 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
18116 if (!ressSpellId)
18117 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
18118
18119 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
18120 victim->RemoveAllAurasOnDeath();
18121
18122 // Stop attacks
18123 victim->CombatStop();
18125
18126 // restore for use at real death
18127 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
18128
18129 // FORM_SPIRITOFREDEMPTION and related auras
18130 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
18131 spiritOfRedemption = true;
18132 }
18133 }
18134 }
18135
18136 if (!spiritOfRedemption)
18137 {
18138 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
18140 }
18141
18142 // Inform pets (if any) when player kills target)
18143 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
18144 // selection will get stuck on same target and break pet react state
18145 if (player)
18146 {
18147 Pet* pet = player->GetPet();
18148 if (pet && pet->IsAlive() && pet->isControlled())
18149 pet->AI()->KilledUnit(victim);
18150 }
18151
18152 // 10% durability loss on death
18153 // clean InHateListOf
18154 if (Player* plrVictim = victim->ToPlayer())
18155 {
18156 // remember victim PvP death for corpse type and corpse reclaim delay
18157 // at original death (not at SpiritOfRedemtionTalent timeout)
18158 plrVictim->SetPvPDeath(player != nullptr);
18159
18160 // only if not player and not controlled by player pet. And not at BG
18161 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
18162 {
18163 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f);
18164 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f, false);
18165 // durability lost message
18166 plrVictim->SendDurabilityLoss();
18167 }
18168 // Call KilledUnit for creatures
18169 if (killer && killer->IsCreature() && killer->IsAIEnabled)
18170 killer->ToCreature()->AI()->KilledUnit(victim);
18171
18172 // last damage from non duel opponent or opponent controlled creature
18173 if (plrVictim->duel)
18174 {
18175 plrVictim->duel->Opponent->CombatStopWithPets(true);
18176 plrVictim->CombatStopWithPets(true);
18177 plrVictim->DuelComplete(DUEL_INTERRUPTED);
18178 }
18179 }
18180 else // creature died
18181 {
18182 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
18183
18184 if (!creature->IsPet() && creature->GetLootMode() > 0)
18185 {
18186 creature->GetThreatMgr().ClearAllThreat();
18187
18188 // must be after setDeathState which resets dynamic flags
18189 if (!creature->loot.isLooted())
18190 {
18192 }
18193 else
18194 {
18195 creature->AllLootRemovedFromCorpse();
18196 }
18197 }
18198
18199 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
18200 if (killer && killer->IsCreature() && killer->IsAIEnabled)
18201 killer->ToCreature()->AI()->KilledUnit(victim);
18202
18203 // Call creature just died function
18204 if (CreatureAI* ai = creature->AI())
18205 {
18206 ai->JustDied(killer);
18207 }
18208
18209 if (TempSummon* summon = creature->ToTempSummon())
18210 {
18211 if (WorldObject* summoner = summon->GetSummoner())
18212 {
18213 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
18214 {
18215 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
18216 }
18217 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
18218 {
18219 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
18220 }
18221 }
18222 }
18223
18224 // Dungeon specific stuff, only applies to players killing creatures
18225 if (creature->GetInstanceId())
18226 {
18227 Map* instanceMap = creature->GetMap();
18228 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
18230
18231 if (instanceMap->IsDungeon() && player)
18232 if (instanceMap->IsRaidOrHeroicDungeon())
18234 instanceMap->ToInstanceMap()->PermBindAllPlayers();
18235 }
18236 }
18237
18238 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
18239 // handle player kill only if not suicide (spirit of redemption for example)
18240 if (player && killer != victim)
18241 {
18242 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
18243 pvp->HandleKill(player, victim);
18244
18245 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
18246 bf->HandleKill(player, victim);
18247 }
18248
18249 //if (victim->IsPlayer())
18250 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
18251 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
18252
18253 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
18254 if (player)
18255 if (Battleground* bg = player->GetBattleground())
18256 {
18257 if (victim->IsPlayer())
18258 bg->HandleKillPlayer(victim->ToPlayer(), player);
18259 else
18260 bg->HandleKillUnit(victim->ToCreature(), player);
18261 }
18262
18263 // achievement stuff
18264 if (killer && victim->IsPlayer())
18265 {
18266 if (killer->IsCreature())
18268 else if (victim != killer && killer->IsPlayer())
18270 }
18271
18272 // Hook for OnPVPKill Event
18273 if (killer)
18274 {
18275 if (Player* killerPlr = killer->ToPlayer())
18276 {
18277 if (Player* killedPlr = victim->ToPlayer())
18278 sScriptMgr->OnPlayerPVPKill(killerPlr, killedPlr);
18279 else if (Creature* killedCre = victim->ToCreature())
18280 sScriptMgr->OnPlayerCreatureKill(killerPlr, killedCre);
18281 }
18282 else if (Creature* killerCre = killer->ToCreature())
18283 {
18284 if (Player* killed = victim->ToPlayer())
18285 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18286 }
18287 }
18288
18289 sScriptMgr->OnUnitDeath(victim, killer);
18290}
#define sBattlefieldMgr
Definition BattlefieldMgr.h:77
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition CreatureData.h:45
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition DBCEnums.h:170
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition LootMgr.h:58
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition Player.h:482
@ UNIT_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3371
@ DUEL_INTERRUPTED
Definition SharedDefines.h:3878
@ PROC_FLAG_KILLED
Definition SpellMgr.h:106
@ PLAYER_SELF_RES_SPELL
Definition UpdateFields.h:370
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition WorldConfig.h:478
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition WorldConfig.h:25
Definition Battlefield.h:205
Definition CreatureAI.h:71
virtual void KilledUnit(Unit *)
Definition CreatureAI.h:132
Loot loot
Definition Creature.h:229
uint16 GetLootMode() const
Definition Creature.h:243
void AllLootRemovedFromCorpse()
Definition Creature.cpp:3002
bool IsLootRewardDisabled() const
Definition Creature.h:365
Player * GetLootRecipient() const
Definition Creature.cpp:1315
bool IsDamageEnoughForLootingAndReward() const
Definition Creature.cpp:3728
Group * GetLootRecipientGroup() const
Definition Creature.cpp:1322
GroupReference * next()
Definition GroupReference.h:36
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1757
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2394
ObjectGuid GetLooterGuid() const
Definition Group.cpp:2331
LootMethod GetLootMethod() const
Definition Group.cpp:2326
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition Group.cpp:1868
void SendLooter(Creature *creature, Player *pLooter)
Definition Group.cpp:967
void PermBindAllPlayers()
Definition Map.cpp:2195
Definition Map.h:163
bool IsRaidOrHeroicDungeon() const
Definition Map.h:298
InstanceMap * ToInstanceMap()
Definition Map.h:377
virtual void SetDynamicFlag(uint32 flag)
Definition Object.h:124
Definition OutdoorPvP.h:186
TeamId GetTeamId(bool original=false) const
Definition Player.h:2106
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12241
uint32 GetResurrectionSpellId()
Definition Player.cpp:12657
OutdoorPvP * GetOutdoorPvP() const
Definition Player.cpp:12558
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition Player.cpp:12771
void RemoveAllAurasOnDeath()
Definition Unit.cpp:5468
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition Unit.cpp:5669
uint32 GetInstanceId() const
Definition Object.h:509
uint32 GetZoneId() const
Definition Object.cpp:3056
@ SMSG_PARTYKILLLOG
Definition Opcodes.h:531
@ SMSG_LOOT_LIST
Definition Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
uint32 mingold
Definition CreatureData.h:231
uint32 maxgold
Definition CreatureData.h:232
uint32 lootid
Definition CreatureData.h:224
Definition LootMgr.h:313
bool empty() const
Definition LootMgr.h:367
bool isLooted() const
Definition LootMgr.h:368
void clear()
Definition LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition LootMgr.cpp:838
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition LootMgr.cpp:571

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), Creature::HasFlagsExtra(), Player::HasPlayerFlag(), HasSpiritOfRedemptionAura(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Object::IsCreature(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), Creature::IsLootRewardDisabled(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), JustDied, CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_illidari_council::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::boss_ignisAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_ahune::JustDied(), npc_frozen_core::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_q12779_an_end_to_all_things_devour_aura::OnRemove(), spell_yogg_saron_insane_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
1219{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by boss_felblood_kaelthas::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), npc_raging_flames::FixateRandomTarget(), spell_chapter2_persuasive_strike::HandleHit(), npc_rancid_mushroom::InitializeAI(), boss_warlord_kalithresh::JustDied(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_wild_wyrm::MovementInform(), npc_pet_gen_plump_turkey::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), npc_singularity::Reset(), boss_archimonde::Reset(), npc_necropolis_health::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_necrotic_shard::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19391{
19392 Player* player = ToPlayer();
19393 if (!player)
19394 {
19395 if (Unit* charmer = GetCharmer())
19396 {
19397 player = charmer->ToPlayer();
19398 if (player && player->m_mover != this)
19399 player = nullptr;
19400 }
19401 }
19402
19403 if (!player)
19404 {
19405 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19406 }
19407 else
19408 {
19409 float vcos, vsin;
19410 GetSinCos(x, y, vsin, vcos);
19411
19412 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19413 data << GetPackGUID();
19414 data << player->GetSession()->GetOrderCounter(); // movement counter
19415 data << float(vcos); // x direction
19416 data << float(vsin); // y direction
19417 data << float(speedXY); // Horizontal speed
19418 data << float(-speedZ); // Z Movement speed (vertical)
19419
19420 player->SendDirectMessage(&data);
19421 player->GetSession()->IncrementOrderCounter();
19422
19423 player->SetCanKnockback(true);
19424 }
19425}
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition MotionMaster.cpp:607
SafeUnitPointer m_mover
Definition Player.h:2347
void SetCanKnockback(bool value)
Definition Player.h:2514
WorldSession * GetSession() const
Definition Player.h:1998
uint32 GetOrderCounter() const
Definition WorldSession.h:600
void IncrementOrderCounter()
Definition WorldSession.h:601
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition Position.cpp:99

References GetCharmer(), GetMotionMaster(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), WorldSession::IncrementOrderCounter(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), Player::SendDirectMessage(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3366{
3367 // Can`t miss on dead target (on skinning for example)
3368 if (!victim->IsAlive() && !victim->IsPlayer())
3369 return SPELL_MISS_NONE;
3370
3371 // vehicles cant miss
3372 if (IsVehicle())
3373 return SPELL_MISS_NONE;
3374
3375 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3376 // resist and deflect chances
3377 // xinef: skip all calculations, proof: Toxic Tolerance quest
3378 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3379 return SPELL_MISS_NONE;
3380
3381 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3382 {
3383 return SPELL_MISS_NONE;
3384 }
3385
3386 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3387 int32 thisLevel = getLevelForTarget(victim);
3388 if (IsCreature() && ToCreature()->IsTrigger())
3389 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3390 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3391
3392 int32 MISS_CHANCE_MULTIPLIER;
3393 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11)
3394 {
3395 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3396 }
3397 else
3398 {
3399 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3400 victim->IsPlayer()
3403 }
3404
3405 // Base hit chance from attacker and victim levels
3406 int32 modHitChance = levelDiff < 3
3407 ? 96 - levelDiff
3408 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3409
3410 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3411 if (Player* modOwner = GetSpellModOwner())
3412 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3413
3414 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3416
3417 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3418 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3419 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3420 {
3421 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3423 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3424 if (spellInfo->IsAffectingArea())
3425 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3426
3427 // Decrease hit chance from victim rating bonus
3428 if (victim->IsPlayer())
3429 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3430 }
3431
3432 int32 HitChance = modHitChance * 100;
3433 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3434 // Xinef: Totems should inherit casters ratings?
3435 if (IsTotem())
3436 {
3437 if (Unit* owner = GetOwner())
3438 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3439 }
3440 else
3441 HitChance += int32(m_modSpellHitChance * 100.0f);
3442
3443 if (HitChance < 100)
3444 HitChance = 100;
3445 else if (HitChance > 10000)
3446 HitChance = 10000;
3447
3448 int32 tmp = 10000 - HitChance;
3449
3450 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3451
3452 if (rand < tmp)
3453 return SPELL_MISS_MISS;
3454
3455 // Chance resist mechanic (select max value from every mechanic spell effect)
3456 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3457 tmp += resist_chance;
3458
3459 // Chance resist debuff
3460 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3461 {
3462 bool bNegativeAura = true;
3463 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3464 {
3465 // Xinef: Check if effect exists!
3466 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3467 {
3468 bNegativeAura = false;
3469 break;
3470 }
3471 }
3472
3473 if (bNegativeAura)
3474 {
3475 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3476 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3477 }
3478
3479 // Players resistance for binary spells
3480 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3481 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3482 }
3483
3484 // Roll chance
3485 if (rand < tmp)
3486 return SPELL_MISS_RESIST;
3487
3488 // cast by caster in front of victim
3489 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3490 {
3491 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3492 tmp += deflect_chance;
3493 if (rand < tmp)
3494 return SPELL_MISS_DEFLECT;
3495 }
3496
3497 return SPELL_MISS_NONE;
3498}
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition SharedDefines.h:677
@ SPELL_MISS_NONE
Definition SharedDefines.h:1530
@ SPELL_MISS_RESIST
Definition SharedDefines.h:1532
@ SPELL_MISS_MISS
Definition SharedDefines.h:1531
@ SPELL_MISS_DEFLECT
Definition SharedDefines.h:1539
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition SpellAuraDefines.h:241
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition SpellAuraDefines.h:223
@ SPELLMOD_RESIST_MISS_CHANCE
Definition SpellDefines.h:92
@ CR_HIT_TAKEN_SPELL
Definition Unit.h:237
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition WorldConfig.h:132
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition WorldConfig.h:486
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition WorldConfig.h:485
float GetRatingBonusValue(CombatRating cr) const
Definition Player.cpp:5268
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6216
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6206
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition Unit.cpp:3171

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13241{
13242 if (!victim || pdamage == 0)
13243 return 0;
13244
13245 if (IsCreature())
13246 {
13247 // Dancing Rune Weapon...
13248 if (GetEntry() == 27893)
13249 {
13250 if (Unit* owner = GetOwner())
13251 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13252 }
13253 }
13254
13255 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13256
13257 // Done fixed damage bonus auras
13258 int32 DoneFlatBenefit = 0;
13259
13260 // ..done
13261 DoneFlatBenefit += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, creatureTypeMask);
13262
13263 // ..done
13264 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13265
13266 // ..done (base at attack power for marked target and base at attack power for creature type)
13267 int32 APbonus = 0;
13268
13269 if (attType == RANGED_ATTACK)
13270 {
13271 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13272
13273 // ..done (base at attack power and creature type)
13275 }
13276 else
13277 {
13278 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13279
13280 // ..done (base at attack power and creature type)
13282 }
13283
13284 if (APbonus != 0) // Can be negative
13285 {
13286 bool normalized = false;
13287 if (spellProto)
13288 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13289 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13290 {
13291 normalized = true;
13292 break;
13293 }
13294 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13295 }
13296
13297 // Done total percent damage auras
13298 float DoneTotalMod = 1.0f;
13299
13300 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13301 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13302 {
13303 // Some spells don't benefit from pct done mods
13304 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, [spellProto, this, damageSchoolMask](AuraEffect const* aurEff)
13305 {
13306 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, false)))
13307 {
13308 if ((aurEff->GetMiscValue() & damageSchoolMask))
13309 {
13310 if (aurEff->GetSpellInfo()->EquippedItemClass == -1)
13311 return true;
13312 else if (!aurEff->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (aurEff->GetSpellInfo()->EquippedItemSubClassMask == 0))
13313 return true;
13314 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements(aurEff->GetSpellInfo()))
13315 return true;
13316 }
13317 }
13318 return false;
13319 });
13320 }
13321
13322 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, [creatureTypeMask, spellProto, this](AuraEffect const* aurEff)
13323 {
13324 return (creatureTypeMask & aurEff->GetMiscValue() && (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, false)));
13325 });
13326
13327 // bonus against aurastate
13328 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, [victim, spellProto, this](AuraEffect const* aurEff)
13329 {
13330 return (victim->HasAuraState(AuraStateType(aurEff->GetMiscValue())) && (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, false)));
13331 });
13332
13333 // done scripted mod (take it from owner)
13334 Unit* owner = GetOwner() ? GetOwner() : this;
13335 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13336 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13337 {
13338 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13339 continue;
13340
13341 if (!(*i)->IsAffectedOnSpell(spellProto))
13342 continue;
13343
13344 switch ((*i)->GetMiscValue())
13345 {
13346 // Tundra Stalker
13347 // Merciless Combat
13348 case 7277:
13349 {
13350 // Merciless Combat
13351 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13352 {
13353 if (!victim->HealthAbovePct(35))
13354 AddPct(DoneTotalMod, (*i)->GetAmount());
13355 }
13356 // Tundra Stalker
13357 else
13358 {
13359 // Frost Fever (target debuff)
13360 if (victim->HasAura(55095))
13361 AddPct(DoneTotalMod, (*i)->GetAmount());
13362 }
13363 break;
13364 }
13365 // Rage of Rivendare
13366 case 7293:
13367 {
13368 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13369 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13370 break;
13371 }
13372 // Marked for Death
13373 case 7598:
13374 case 7599:
13375 case 7600:
13376 case 7601:
13377 case 7602:
13378 {
13379 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13380 AddPct(DoneTotalMod, (*i)->GetAmount());
13381 break;
13382 }
13383 // Dirty Deeds
13384 case 6427:
13385 case 6428:
13386 {
13387 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13388 {
13389 // effect 0 has expected value but in negative state
13390 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13391 AddPct(DoneTotalMod, bonus);
13392 }
13393 break;
13394 }
13395 }
13396 }
13397
13398 // Custom scripted damage
13399 if (spellProto)
13400 switch (spellProto->SpellFamilyName)
13401 {
13403 // Glacier Rot
13404 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13406 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13407 AddPct(DoneTotalMod, aurEff->GetAmount());
13408 break;
13409 }
13410
13411 // Some spells don't benefit from done mods
13412 if (spellProto)
13413 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13414 {
13415 DoneFlatBenefit = 0;
13416 DoneTotalMod = 1.0f;
13417 }
13418
13419 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13420
13421 // apply spellmod to Done damage
13422 if (spellProto)
13423 if (Player* modOwner = GetSpellModOwner())
13424 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13425
13426 // bonus result can be negative
13427 return uint32(std::max(tmpDamage, 0.0f));
13428}
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition SharedDefines.h:910
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition SharedDefines.h:533
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition SpellAuraDefines.h:122
@ SPELLMOD_DAMAGE
Definition SpellDefines.h:76
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition Unit.cpp:17462
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition Unit.h:1422

References SpellInfo::Effects, GetAPMultiplier(), GetCreatureTypeMask(), Object::GetEntry(), GetOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplier(), Object::IsCreature(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13431{
13432 if (pdamage == 0)
13433 return 0;
13434
13435 int32 TakenFlatBenefit = 0;
13436
13437 // ..taken
13438 TakenFlatBenefit += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_DAMAGE_TAKEN, damageSchoolMask);
13439
13440 if (attType != RANGED_ATTACK)
13442 else
13444
13445 // Taken total percent damage auras
13446 float TakenTotalMod = 1.0f;
13447
13449
13450 // .. taken pct (special attacks)
13451 if (spellProto)
13452 {
13453 // From caster spells
13454 TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, [attacker, spellProto](AuraEffect const* aurEff)
13455 {
13456 return attacker->GetGUID() == aurEff->GetCasterGUID() && aurEff->IsAffectedOnSpell(spellProto);
13457 });
13458
13459 // Mod damage from spell mechanic
13460 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13461
13462 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13463 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13464 mechanicMask |= (1 << MECHANIC_BLEED);
13465
13466 if (mechanicMask)
13467 {
13468 TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, [mechanicMask](AuraEffect const* aurEff) -> bool
13469 {
13470 if (mechanicMask & uint32(1 << (aurEff->GetMiscValue())))
13471 return true;
13472 return false;
13473 });
13474 }
13475 }
13476
13477 TakenTotalMod = processDummyAuras(TakenTotalMod);
13478
13479 // .. taken pct: class scripts
13480 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13481 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13482 {
13483 switch ((*i)->GetMiscValue())
13484 {
13485 }
13486 }*/
13487
13488 if (attType != RANGED_ATTACK)
13489 {
13491 }
13492 else
13493 {
13495 }
13496
13497 // No positive taken bonus, custom attr
13498 if (spellProto)
13499 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13500 {
13501 TakenFlatBenefit = 0;
13502 TakenTotalMod = 1.0f;
13503 }
13504
13505 // xinef: sanctified wrath talent
13506 if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistAura())
13507 {
13508 float ignoreModifier = 1.0f - TakenTotalMod;
13509 bool addModifier = false;
13511 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13512 if ((*j)->GetMiscValue() & damageSchoolMask)
13513 {
13514 ApplyPct(ignoreModifier, (*j)->GetAmount());
13515 addModifier = true;
13516 }
13517
13518 if (addModifier)
13519 TakenTotalMod += ignoreModifier;
13520 }
13521
13522 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13523
13524 // bonus result can be negative
13525 return uint32(std::max(tmpDamage, 0.0f));
13526}
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:177
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition SpellInfo.h:197
float processDummyAuras(float TakenTotalMod) const
Definition Unit.cpp:12101
bool HasIgnoreTargetResistAura() const
Definition Unit.h:1808

References ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), AuraEffect::GetCasterGUID(), Object::GetGUID(), AuraEffect::GetMiscValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), AuraEffect::IsAffectedOnSpell(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3193{
3194 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3195 // resist and deflect chances
3196 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3197 return SPELL_MISS_NONE;
3198
3199 WeaponAttackType attType = BASE_ATTACK;
3200
3201 // Check damage class instead of attack type to correctly handle judgements
3202 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3203 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3204 attType = RANGED_ATTACK;
3205
3206 int32 attackerWeaponSkill;
3207 // skill value for these spells (for example judgements) is 5* level
3208 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3209 attackerWeaponSkill = GetLevel() * 5;
3210 // bonus from skills is 0.04% per skill Diff
3211 else
3212 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3213
3214 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3215
3216 uint32 roll = urand (0, 10000);
3217
3218 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3219 // Roll miss
3220 uint32 tmp = missChance;
3221 if (roll < tmp)
3222 return SPELL_MISS_MISS;
3223
3224 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3225 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3226 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3227
3228 // Same spells cannot be parry/dodge
3229 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3230 return SPELL_MISS_NONE;
3231
3232 // Chance resist mechanic
3233 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3234 tmp += resist_chance;
3235 if (roll < tmp)
3236 return SPELL_MISS_RESIST;
3237
3238 // Ranged attacks can only miss, resist and deflect
3239 if (attType == RANGED_ATTACK)
3240 {
3241 // only if in front
3242 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3243 {
3244 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3245 tmp += deflect_chance;
3246 if (roll < tmp)
3247 return SPELL_MISS_DEFLECT;
3248 }
3249
3250 canDodge = false;
3251 canParry = false;
3252 }
3253
3254 // Check for attack from behind
3255 // xinef: if from behind or spell requires cast from behind
3256 if (!victim->HasInArc(M_PI, this))
3257 {
3258 if (!victim->HasIgnoreHitDirectionAura() || spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET))
3259 {
3260 // Can`t dodge from behind in PvP (but its possible in PvE)
3261 if (victim->IsPlayer())
3262 {
3263 canDodge = false;
3264 }
3265
3266 // Can`t parry or block
3267 canParry = false;
3268 canBlock = false;
3269 }
3270 }
3271
3272 // Check creatures flags_extra for disable parry
3273 if (victim->IsCreature())
3274 {
3275 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3276 // Xinef: no dodge flag
3277 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3278 canDodge = false;
3279 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3280 canParry = false;
3281 // Check creatures flags_extra for disable block
3282 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3283 canBlock = false;
3284 }
3285 // Ignore combat result aura
3287 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3288 {
3289 if (!(*i)->IsAffectedOnSpell(spellInfo))
3290 continue;
3291 switch ((*i)->GetMiscValue())
3292 {
3293 case MELEE_HIT_DODGE:
3294 canDodge = false;
3295 break;
3296 case MELEE_HIT_BLOCK:
3297 canBlock = false;
3298 break;
3299 case MELEE_HIT_PARRY:
3300 canParry = false;
3301 break;
3302 default:
3303 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3304 break;
3305 }
3306 }
3307
3308 if (canDodge)
3309 {
3310 // Roll dodge
3311 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3312 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3314 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3315 // Reduce dodge chance by attacker expertise rating
3316 if (IsPlayer())
3317 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3318 else
3320
3321 // xinef: cant dodge while casting or while stunned
3322 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3323 dodgeChance = 0;
3324
3325 tmp += dodgeChance;
3326 if (roll < tmp)
3327 return SPELL_MISS_DODGE;
3328 }
3329
3330 if (canParry)
3331 {
3332 // Roll parry
3333 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3334 // Reduce parry chance by attacker expertise rating
3335 if (IsPlayer())
3336 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3337 else
3339
3340 // xinef: cant parry while casting or while stunned
3341 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3342 parryChance = 0;
3343
3344 tmp += parryChance;
3345 if (roll < tmp)
3346 return SPELL_MISS_PARRY;
3347 }
3348
3349 if (canBlock)
3350 {
3351 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3352
3353 // xinef: cant block while casting or while stunned
3354 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3355 blockChance = 0;
3356
3357 tmp += blockChance;
3358 if (roll < tmp)
3359 return SPELL_MISS_BLOCK;
3360 }
3361
3362 return SPELL_MISS_NONE;
3363}
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition CreatureData.h:47
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition CreatureData.h:68
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition SharedDefines.h:676
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition SharedDefines.h:675
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition SharedDefines.h:507
@ SPELL_MISS_PARRY
Definition SharedDefines.h:1534
@ SPELL_MISS_DODGE
Definition SharedDefines.h:1533
@ SPELL_MISS_BLOCK
Definition SharedDefines.h:1535
@ SPELL_AURA_MOD_EXPERTISE
Definition SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition SpellAuraDefines.h:311
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition SpellInfo.h:193
float GetUnitDodgeChance() const
Definition Unit.cpp:3669
float GetUnitParryChance() const
Definition Unit.cpp:3686
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition Unit.cpp:19235
uint32 flags_extra
Definition CreatureData.h:246

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, Object::IsCreature(), IsNonMeleeSpellCast(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
19236{
19237 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
19238 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
19239 {
19240 return 0.0f;
19241 }
19242
19243 //calculate miss chance
19244 float missChance = victim->GetUnitMissChance(attType);
19245
19246 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
19247 if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
19248 {
19249 missChance += 19;
19250 }
19251
19252 // bonus from skills is 0.04%
19253 //miss_chance -= skillDiff * 0.04f;
19254 int32 diff = -skillDiff;
19255 if (victim->IsPlayer())
19256 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
19257 else
19258 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
19259
19260 // Calculate hit chance
19261 float hitChance = 100.0f;
19262
19263 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19264 if (spellId)
19265 {
19266 if (Player* modOwner = GetSpellModOwner())
19267 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19268 }
19269
19270 missChance -= hitChance - 100.0f;
19271
19272 if (attType == RANGED_ATTACK)
19273 missChance -= m_modRangedHitChance;
19274 else
19275 missChance -= m_modMeleeHitChance;
19276
19277 // Limit miss chance from 0 to 60%
19278 if (missChance < 0.0f)
19279 return 0.0f;
19280 if (missChance > 60.0f)
19281 return 60.0f;
19282 return missChance;
19283}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), HasOffhandWeaponForAttack(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10702{
10703 if (apply)
10704 {
10705 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10706 {
10707 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10708 Unit::AuraMap& tAuras = GetOwnedAuras();
10709 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10710 {
10711 if ((*itr).second->IsRemoved())
10712 continue;
10713
10714 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10715 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10716 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10717 }
10718 }
10719 }
10720 else
10721 {
10722 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10723 {
10724 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10725
10726 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10727 {
10728 Unit::AuraMap& tAuras = GetOwnedAuras();
10729 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10730 {
10731 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10732 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10733 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10734 }
10735 }
10736 }
10737 }
10738}
@ AURA_STATE_ENRAGE
Definition SharedDefines.h:1320
@ AURA_EFFECT_HANDLE_REAL
Definition SpellAuraDefines.h:42
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:827
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:842
std::multimap< uint32, Aura * > AuraMap
Definition Unit.h:660
AuraMap & GetOwnedAuras()
Definition Unit.h:1358

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14265{
14266 int32 gain = 0;
14267
14268 if (dVal == 0)
14269 return 0;
14270
14271 int32 curHealth = (int32)GetHealth();
14272
14273 int32 val = dVal + curHealth;
14274 if (val <= 0)
14275 {
14276 SetHealth(0);
14277 return -curHealth;
14278 }
14279
14280 int32 maxHealth = (int32)GetMaxHealth();
14281
14282 if (val < maxHealth)
14283 {
14284 SetHealth(val);
14285 gain = val - curHealth;
14286 }
14287 else if (curHealth != maxHealth)
14288 {
14289 SetHealth(maxHealth);
14290 gain = maxHealth - curHealth;
14291 }
14292
14293 return gain;
14294}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14323{
14324 if (dVal == 0)
14325 return 0;
14326
14327 int32 gain = 0;
14328
14329 int32 curPower = (int32)GetPower(power);
14330
14331 int32 val = dVal + curPower;
14332 if (val <= 0)
14333 {
14334 SetPower(power, 0, withPowerUpdate);
14335 return -curPower;
14336 }
14337
14338 int32 maxPower = (int32)GetMaxPower(power);
14339
14340 if (val < maxPower)
14341 {
14342 SetPower(power, val, withPowerUpdate);
14343 gain = val - curPower;
14344 }
14345 else if (curPower != maxPower)
14346 {
14347 SetPower(power, maxPower, withPowerUpdate);
14348 gain = maxPower - curPower;
14349 }
14350
14351 if (GetAI())
14352 {
14353 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14354 }
14355
14356 return gain;
14357}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Called when the creature power updates.
Definition UnitAI.h:374
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition Unit.cpp:15801

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition ThreatMgr.h:307

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
15079{
15080 if (!spellInfo || castTime < 0)
15081 return;
15082
15083 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
15084 return;
15085
15086 // called from caster
15087 if (Player* modOwner = GetSpellModOwner())
15089 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
15090
15091 switch (spellInfo->DmgClass)
15092 {
15094 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
15095 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15096 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
15097 castTime = 500;
15098 break;
15100 break; // no known cases
15102 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15103 break;
15105 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
15106 break;
15107 default:
15108 break;
15109 }
15110}
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition SharedDefines.h:591
@ SPELLMOD_CASTING_TIME
Definition SpellDefines.h:86
bool CanInstantCast() const
Definition Unit.h:1572

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14979{
14980 // don't mod permanent auras duration
14981 if (duration < 0)
14982 return duration;
14983
14984 // some auras are not affected by duration modifiers
14985 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14986 return duration;
14987
14988 // cut duration only of negative effects
14989 // xinef: also calculate self casts, spell can be reflected for example
14990 if (!positive)
14991 {
14992 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14993
14994 int32 durationMod;
14995 int32 durationMod_always = 0;
14996 int32 durationMod_not_stack = 0;
14997
14998 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14999 {
15000 if (!(mechanic & 1 << i))
15001 continue;
15002
15003 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
15004 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
15005 continue;
15006
15007 // Find total mod value (negative bonus)
15008 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
15009 // Find max mod (negative bonus)
15010 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
15011 // Check if mods applied before were weaker
15012 if (new_durationMod_always < durationMod_always)
15013 durationMod_always = new_durationMod_always;
15014 if (new_durationMod_not_stack < durationMod_not_stack)
15015 durationMod_not_stack = new_durationMod_not_stack;
15016 }
15017
15018 // Select strongest negative mod
15019 if (durationMod_always > durationMod_not_stack)
15020 durationMod = durationMod_not_stack;
15021 else
15022 durationMod = durationMod_always;
15023
15024 if (durationMod != 0)
15025 AddPct(duration, durationMod);
15026
15027 // there are only negative mods currently
15028 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
15029 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
15030
15031 durationMod = 0;
15032 if (durationMod_always > durationMod_not_stack)
15033 durationMod += durationMod_not_stack;
15034 else
15035 durationMod += durationMod_always;
15036
15037 if (durationMod != 0)
15038 AddPct(duration, durationMod);
15039 }
15040 else
15041 {
15042 // else positive mods here, there are no currently
15043 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
15044 }
15045
15046 // Glyphs which increase duration of selfcasted buffs
15047 if (target == this)
15048 {
15049 switch (spellProto->SpellFamilyName)
15050 {
15051 case SPELLFAMILY_DRUID:
15052 if (spellProto->SpellFamilyFlags[0] & 0x100)
15053 {
15054 // Glyph of Thorns
15055 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
15056 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15057 }
15058 break;
15060 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
15061 {
15062 // Glyph of Blessing of Might
15063 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
15064 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15065 }
15066 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
15067 {
15068 // Glyph of Blessing of Wisdom
15069 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
15070 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15071 }
15072 break;
15073 }
15074 }
15075 return std::max(duration, 0);
15076}
constexpr auto MINUTE
Definition Common.h:47
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition SharedDefines.h:653
@ MECHANIC_ENRAGED
Definition SharedDefines.h:1367
@ MECHANIC_DISORIENTED
Definition SharedDefines.h:1338
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition SpellAuraDefines.h:295

References AddPct(), SpellInfo::Dispel, AuraEffect::GetAmount(), GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

void Unit::MonsterMoveWithSpeed ( float  x,
float  y,
float  z,
float  speed 
)
531{
532 Movement::MoveSplineInit init(this);
533 init.MoveTo(x, y, z);
534 init.SetVelocity(speed);
535 init.Launch();
536}

References Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetVelocity().

Referenced by CinematicMgr::UpdateCinematicLocation().

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13615{
13616 if (mount)
13618
13620
13621 if (Player* player = ToPlayer())
13622 {
13623 sScriptMgr->AnticheatSetUnderACKmount(player);
13624
13625 // mount as a vehicle
13626 if (VehicleId)
13627 {
13628 if (CreateVehicleKit(VehicleId, creatureEntry))
13629 {
13630 GetVehicleKit()->Reset();
13631
13632 // Send others that we now have a vehicle
13634 data << GetPackGUID();
13635 data << uint32(VehicleId);
13636 SendMessageToSet(&data, true);
13637
13639 player->SendDirectMessage(&data);
13640
13641 // mounts can also have accessories
13643 }
13644 }
13645
13646 // unsummon pet
13647 Pet* pet = player->GetPet();
13648 if (pet)
13649 {
13651 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13652 if (bg && bg->isArena())
13654 else
13655 player->UnsummonPetTemporaryIfAny();
13656 }
13657
13658 // xinef: if we have charmed npc, stun him also
13659 if (Unit* charm = player->GetCharm())
13660 if (charm->IsCreature())
13661 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13662
13663 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13664 data << GetPackGUID();
13665 data << player->GetSession()->GetOrderCounter(); // movement counter
13666 data << player->GetCollisionHeight();
13667 player->SendDirectMessage(&data);
13668 player->GetSession()->IncrementOrderCounter();
13669 }
13670
13672}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition SpellDefines.h:60
bool isArena() const
Definition Battleground.h:404
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition Unit.cpp:18962
void Reset(bool evading=false)
Definition Vehicle.cpp:120
void InstallAllAccessories(bool evading)
Definition Vehicle.cpp:87

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), and WorldSession::SendDoFlight().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19960{
19961 DisableSpline();
19962 if (IsPlayer())
19963 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
19964 else
19965 {
19966 Position pos = {x, y, z, orientation};
19967 SendTeleportPacket(pos);
19968 UpdatePosition(x, y, z, orientation, true);
19971 }
19972}
@ TELE_TO_WITH_PET
Definition Player.h:822
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition Player.h:821
@ TELE_TO_SPELL
Definition Player.h:820
@ TELE_TO_NOT_LEAVE_COMBAT
Definition Player.h:818
@ TELE_TO_NOT_UNSUMMON_PET
Definition Player.h:819
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition Player.h:817
void ReinitializeMovement()
Definition MotionMaster.cpp:940
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1352
void SendTeleportPacket(Position &pos)
Definition Unit.cpp:19981
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:19377
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:20000

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19955{
19956 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
19957}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition Unit.cpp:19954

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::DoAction(), npc_akama_illidan::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), NearTeleportTo(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_chesspiece::Reset(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20210{
20211 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20212 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20213 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20215 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20216 if (IsInWorld())
20217 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20218
20219 LOG_INFO("entities.unit", "Summon Slot: ");
20220 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20221 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20222 LOG_INFO("server.loading", " ");
20223
20224 LOG_INFO("entities.unit", "Controlled List: ");
20225 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20226 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20227 LOG_INFO("server.loading", " ");
20228
20229 LOG_INFO("entities.unit", "Aura List: ");
20230 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20231 LOG_INFO("entities.unit", "{}, ", itr->first);
20232 LOG_INFO("server.loading", " ");
20233
20234 if (IsVehicle())
20235 {
20236 LOG_INFO("entities.unit", "Passenger List: ");
20237 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20238 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20239 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20240 LOG_INFO("server.loading", " ");
20241 }
20242
20243 if (GetVehicle())
20244 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20245}
Seats
Definition boss_flame_leviathan.cpp:168
SeatMap Seats
Definition Vehicle.h:56

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, Vehicle::Seats, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20936{
20937 Creature const* creature = ToCreature();
20938
20939 // UNIT_NPC_FLAGS
20940 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20941 {
20942 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20943
20944 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20945 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20946
20947 if (!target->CanSeeSpellClickOn(creature))
20948 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20949
20950 if (!target->CanSeeVendor(creature))
20951 {
20952 appendValue &= ~UNIT_NPC_FLAG_REPAIR;
20953 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20954 }
20955
20956 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
20957 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20958
20959 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20960 }
20961
20962 // UNIT_FIELD_AURASTATE
20963 if (posPointers.UnitFieldAuraStatePos >= 0)
20964 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20965
20966 // UNIT_FIELD_FLAGS
20967 if (posPointers.UnitFieldFlagsPos >= 0)
20968 {
20969 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20970 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20971 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20972
20973 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20974 }
20975
20976 // UNIT_FIELD_DISPLAYID
20977 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20978 if (posPointers.UnitFieldDisplayPos >= 0)
20979 {
20981 if (creature)
20982 {
20983 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20984
20985 // this also applies for transform auras
20986 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20987 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20988 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
20989 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
20990 {
20991 cinfo = transformInfo;
20992 break;
20993 }
20994
20996 {
20997 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20998 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
20999 else
21000 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
21001 }
21002 }
21003
21004 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
21005 }
21006
21007 // UNIT_DYNAMIC_FLAGS
21008 // Hide lootable animation for unallowed players.
21009 if (posPointers.UnitDynamicFlagsPos >= 0)
21010 {
21012
21013 if (creature)
21014 {
21015 if (creature->hasLootRecipient())
21016 {
21017 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
21018 if (creature->isTappedBy(target))
21019 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
21020 }
21021
21022 if (!target->isAllowedToLoot(creature))
21023 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
21024 }
21025
21026 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
21027 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
21029 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
21030
21031 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
21032 }
21033
21034 // UNIT_FIELD_BYTES_2
21035 if (posPointers.UnitFieldBytes2Pos >= 0)
21036 {
21037 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
21038 {
21040 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
21041 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
21042 // Allow targetting opposite faction in party when enabled in config
21043 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!
21044 }// pussywizard / Callmephil
21045 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
21046 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
21047 {
21048 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
21049 }
21050 }
21051
21052 // UNIT_FIELD_FACTIONTEMPLATE
21053 if (posPointers.UnitFieldFactionTemplatePos >= 0)
21054 {
21055 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
21056 {
21058 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
21059 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
21060 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
21061 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
21062 }// pussywizard / Callmephil
21063 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
21064 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
21065 {
21066 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
21067 }
21068 else if (target->IsGMSpectator() && IsControlledByPlayer())
21069 {
21070 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
21071 }
21072 }
21073
21074 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
21075}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition CreatureData.h:52
@ UNIT_DYNFLAG_TRACK_UNIT
Definition SharedDefines.h:3372
@ CONFIG_INSTANT_TAXI
Definition WorldConfig.h:341
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition WorldConfig.h:34
void put(std::size_t pos, T value)
Definition ByteBuffer.h:137
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition Creature.cpp:1274
bool isTappedBy(Player const *player) const
Definition Creature.cpp:1390
bool isAllowedToLoot(Creature const *creature)
Definition PlayerStorage.cpp:5617
bool CanSeeVendor(Creature const *creature) const
Definition Player.cpp:14413
bool IsGMSpectator() const
Definition Player.h:1165
bool IsSpectator() const
Definition Player.h:2586
bool CanSeeSpellClickOn(Creature const *creature) const
Definition Player.cpp:14323
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition Unit.cpp:10740
bool IsGMAccount() const
Definition WorldSession.cpp:206
int32 UnitFieldFlagsPos
Definition UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition UnitUtils.h:97
uint32 CreatureDisplayID
Definition CreatureData.h:179
CreatureModel const * GetFirstInvisibleModel() const
Definition Creature.cpp:163
CreatureModel const * GetFirstVisibleModel() const
Definition Creature.cpp:173

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), CreatureTemplate::HasFlagsExtra(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), Player::IsGMSpectator(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual

Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.

16886{
16887 if (slot >= MAX_MOTION_SLOT)
16888 return;
16889
16890 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16891 movementGenerator->Pause(timer);
16892
16893 StopMoving();
16894}
@ MAX_MOTION_SLOT
Definition MotionMaster.h:66
Definition MovementGenerator.h:28
void StopMoving()
Definition Unit.cpp:16866

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), boss_shade_of_aran::SetGUID(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20320{
20321 CharmInfo* charmInfo = GetCharmInfo();
20322 if (!charmInfo || !IsCreature())
20323 return;
20324
20325 if ((sDisableMgr->IsPathfindingEnabled(GetMap()) || result != SPELL_FAILED_LINE_OF_SIGHT) && target)
20326 {
20327 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20328 if (Unit* owner = GetOwner())
20329 {
20330 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20331 {
20332 AttackStop();
20333 charmInfo->SetIsAtStay(false);
20334 charmInfo->SetIsCommandAttack(true);
20335 charmInfo->SetIsReturning(false);
20336 charmInfo->SetIsFollowing(false);
20337
20338 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20339 }
20340 else if (owner->IsValidAttackTarget(target))
20341 {
20342 AttackStop();
20343 charmInfo->SetIsAtStay(false);
20344 charmInfo->SetIsCommandAttack(true);
20345 charmInfo->SetIsReturning(false);
20346 charmInfo->SetIsFollowing(false);
20347
20348 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20349 ToCreature()->AI()->AttackStart(target);
20350 else
20351 GetMotionMaster()->MoveChase(target);
20352 }
20353 }
20354
20355 // can be extended in future
20356 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20357 {
20358 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20359 charmInfo->SetForcedTargetGUID(target->GetGUID());
20360 }
20361 else
20362 {
20363 charmInfo->SetForcedSpell(0);
20365 }
20366 }
20367}
#define sDisableMgr
Definition DisableMgr.h:88
constexpr float PET_FOLLOW_DIST
Definition PetDefines.h:206
@ SPELL_FAILED_OUT_OF_RANGE
Definition SharedDefines.h:1057
@ SPELL_FAILED_LINE_OF_SIGHT
Definition SharedDefines.h:1007
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:314
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:446
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition CharmInfo.h:177
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition CharmInfo.h:179
void SetIsCommandAttack(bool val)
Definition CharmInfo.cpp:303

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), SpellInfo::Id, Object::IsCreature(), IsFriendlyTo(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, sDisableMgr, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, and Object::ToCreature().

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6606{
6607 // Not much to do if no flags are set.
6608 if (procAttacker && actor)
6609 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6610 // Now go on with a victim's events'n'auras
6611 // Not much to do if no flags are set or there is no victim
6612 if (victim && victim->IsAlive() && procVictim)
6613 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6614}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
16276{
16277 // Player is loaded now - do not allow passive spell casts to proc
16278 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
16279 return;
16280 // For melee/ranged based attack need update skills and set some Aura states if victim present
16281 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16282 {
16283 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16284 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16285 return;
16286
16287 // Update skills here for players
16288 // only when you are not fighting other players or their pets/totems (pvp)
16289 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16290 {
16291 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16293 {
16294 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16295 }
16296 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16297 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16298 {
16299 ToPlayer()->UpdateCombatSkills(target, attType, true);
16300 }
16301 }
16302 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16304 {
16305 // for victim
16306 if (isVictim)
16307 {
16308 // if victim and dodge attack
16309 if (procExtra & PROC_EX_DODGE)
16310 {
16311 // Update AURA_STATE on dodge
16312 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16313 {
16316 }
16317 }
16318 // if victim and parry attack
16319 if (procExtra & PROC_EX_PARRY)
16320 {
16321 // For Hunters only Counterattack (skip Mongoose bite)
16323 {
16326 }
16327 else
16328 {
16331 }
16332 }
16333 // if and victim block attack
16334 if (procExtra & PROC_EX_BLOCK)
16335 {
16338 }
16339 }
16340 else // For attacker
16341 {
16342 // Overpower on victim dodge
16343 if (procExtra & PROC_EX_DODGE)
16344 {
16346 {
16347 AddComboPoints(target, 1);
16349 }
16350 }
16351
16352 // Wolverine Bite
16353 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16354 {
16355 AddComboPoints(target, 1);
16357 }
16358 }
16359 }
16360 }
16361
16362 Unit* actor = isVictim ? target : this;
16363 Unit* actionTarget = !isVictim ? target : this;
16364
16365 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16366
16367 ProcTriggeredList procTriggered;
16368 // Fill procTriggered list
16369 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16370 {
16371 // Do not allow auras to proc from effect triggered by itself
16372 if (procAura && procAura->Id == itr->first)
16373 continue;
16374
16375 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16376 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16377 continue;
16378
16379 ProcTriggeredData triggerData(itr->second->GetBase());
16380 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16381 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16382 if (isVictim)
16383 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16384
16385 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16386
16387 // only auras that have trigger spell should proc from fully absorbed damage
16388 if (procExtra & PROC_EX_ABSORB && isVictim)
16389 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16390 active = true;
16391
16392 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16393 // only player spells are taken into account
16394 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16395 active = true;
16396
16397 // AuraScript Hook
16398 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16399 {
16400 continue;
16401 }
16402
16403 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16404
16405 // AuraScript Hook
16406 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16407 {
16408 continue;
16409 }
16410
16411 // do checks using conditions table
16412 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16413 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16414 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16415 {
16416 continue;
16417 }
16418
16419 bool hasTriggeredProc = false;
16420 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16421 {
16422 if (itr->second->HasEffect(i))
16423 {
16424 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16425
16426 // Skip this auras
16427 if (isNonTriggerAura[aurEff->GetAuraType()])
16428 continue;
16429
16430 // If not trigger by default and spellProcEvent == nullptr - skip
16431 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16432 continue;
16433
16434 switch (aurEff->GetAuraType())
16435 {
16438 case SPELL_AURA_DUMMY:
16440 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16441 {
16442 triggerData.triggerSpelId[i] = triggerSpellId;
16443 hasTriggeredProc = true;
16444 }
16445 break;
16446 default:
16447 break;
16448 }
16449
16450 // Some spells must always trigger
16451 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16452 triggerData.effMask |= 1 << i;
16453 }
16454 }
16455
16456 if (triggerData.effMask)
16457 {
16458 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16459 if (hasTriggeredProc)
16460 {
16461 bool proccessed = false;
16462 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16463 {
16464 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16465 {
16466 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16467 if (iter != procTriggered.end())
16468 {
16469 std::advance(iter, 1);
16470 procTriggered.insert(iter, triggerData);
16471 proccessed = true;
16472 break;
16473 }
16474 }
16475 }
16476
16477 if (!proccessed)
16478 {
16479 procTriggered.push_front(triggerData);
16480 }
16481 }
16482 else
16483 {
16484 procTriggered.push_front(triggerData);
16485 }
16486 }
16487 }
16488
16489 // Nothing found
16490 if (procTriggered.empty())
16491 return;
16492
16493 // Note: must SetCantProc(false) before return
16495 SetCantProc(true);
16496
16497 // Handle effects proceed this time
16498 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16499 {
16500 // look for aura in auras list, it may be removed while proc event processing
16501 if (i->aura->IsRemoved())
16502 continue;
16503
16504 bool useCharges = i->aura->IsUsingCharges();
16505 // no more charges to use, prevent proc
16506 if (useCharges && !i->aura->GetCharges())
16507 continue;
16508
16509 bool takeCharges = false;
16510 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16511
16512 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16513
16514 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16515
16516 // For players set spell cooldown if need
16517 uint32 cooldown = 0;
16518 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16519 cooldown = i->spellProcEvent->cooldown;
16520
16521 // Xinef: set cooldown for actual proc
16522 eventInfo.SetProcCooldown(cooldown);
16523
16524 // Note: must SetCantProc(false) before return
16526 SetCantProc(true);
16527
16528 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16529
16530 // "handled" is needed as long as proc can be handled in multiple places
16531 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16532 {
16533 uint32 Id = i->aura->GetId();
16534 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16535 takeCharges = true;
16536 }
16537
16538 if (!handled)
16539 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16540 {
16541 if (!(i->effMask & (1 << effIndex)))
16542 continue;
16543
16544 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16545 ASSERT(triggeredByAura);
16546
16547 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16548 if (prevented)
16549 {
16550 takeCharges = true;
16551 continue;
16552 }
16553
16554 switch (triggeredByAura->GetAuraType())
16555 {
16557 {
16558 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16559 // Don`t drop charge or add cooldown for not started trigger
16560 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16561 takeCharges = true;
16562 break;
16563 }
16565 {
16566 // target has to be valid
16567 if (!eventInfo.GetProcTarget())
16568 break;
16569
16570 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16571 takeCharges = true;
16572 break;
16573 }
16575 case SPELL_AURA_DUMMY:
16576 {
16577 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16578 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16579 takeCharges = true;
16580 break;
16581 }
16586 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16587 takeCharges = true;
16588 break;
16590 {
16591 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16592 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16593 takeCharges = true;
16594 break;
16595 }
16597 {
16598 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16599 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16600 if (damage > 0)
16601 {
16603 takeCharges = true;
16604 }
16605 break;
16606 }
16608 {
16609 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16610 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16611 HandleAuraRaidProcFromCharge(triggeredByAura);
16612 takeCharges = true;
16613 break;
16614 }
16616 {
16617 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16618
16619 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16620 takeCharges = true;
16621 break;
16622 }
16624 // Skip melee hits or instant cast spells
16625 // xinef: check channeled spells which are affected by haste also
16626 if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) &&
16627 (procSpellInfo->CalcCastTime() > 0 /*||
16628 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16629 takeCharges = true;
16630 break;
16632 // Skip Melee hits and spells ws wrong school
16633 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16634 takeCharges = true;
16635 break;
16637 // Skip Melee hits and targets with magnet aura
16638 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16639 takeCharges = true;
16640 break;
16643 // Skip melee hits and spells ws wrong school or zero cost
16644 if (procSpellInfo &&
16645 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16646 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16647 takeCharges = true;
16648 break;
16651 // Compare mechanic
16652 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16653 takeCharges = true;
16654 break;
16656 // Compare casters
16657 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16658 takeCharges = true;
16659 break;
16660 // CC Auras which use their amount amount to drop
16661 // Are there any more auras which need this?
16667 {
16668 // Spell own direct damage at apply wont break the CC
16669 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16670 if (procSpellInfo)
16671 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16672 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16673 break;
16674
16675 // chargeable mods are breaking on hit
16676 if (useCharges)
16677 takeCharges = true;
16678 else if (triggeredByAura->GetAmount()) // aura must have amount
16679 {
16680 int32 damageLeft = triggeredByAura->GetAmount();
16681 // No damage left
16682 if (damageLeft < int32(damage))
16683 i->aura->Remove();
16684 else
16685 triggeredByAura->SetAmount(damageLeft - damage);
16686 }
16687 break;
16688 }
16690 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16691 break;
16692 takeCharges = true;
16693 break;
16696 {
16697 if (triggeredByAura->GetSpellModifier())
16698 {
16699 // Do proc if mod is consumed by spell
16700 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16701 {
16702 takeCharges = true;
16703 }
16704 }
16705 break;
16706 }
16707 default:
16708 takeCharges = true;
16709 break;
16710 }
16711 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16712 }
16713 // Remove charge (aura can be removed by triggers)
16714 // xinef: take into account attribute6 of proc spell
16715 if (prepare && useCharges && takeCharges)
16716 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16717 i->aura->DropCharge();
16718
16719 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16720
16722 SetCantProc(false);
16723 }
16724
16725 // Cleanup proc requirements
16727 SetCantProc(false);
16728}
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition ConditionMgr.h:149
@ EFFECT_2
Definition SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition SharedDefines.h:523
#define EFFECT_ALL
Definition SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition SharedDefines.h:620
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition SpellAuraDefines.h:128
@ PROC_HIT_CRITICAL
Definition SpellMgr.h:252
#define MELEE_BASED_TRIGGER_MASK
Definition SpellMgr.h:181
@ PROC_EX_INTERNAL_CANT_PROC
Definition SpellMgr.h:217
@ PROC_FLAG_DONE_PERIODIC
Definition SpellMgr.h:133
static bool isNonTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:107
static bool isTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:105
std::list< ProcTriggeredData > ProcTriggeredList
Definition Unit.cpp:16075
@ REACTIVE_OVERPOWER
Definition Unit.h:610
@ REACTIVE_DEFENSE
Definition Unit.h:608
@ REACTIVE_HUNTER_PARRY
Definition Unit.h:609
@ REACTIVE_WOLVERINE_BITE
Definition Unit.h:611
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition SpellAuraEffects.cpp:7271
SpellModifier * GetSpellModifier() const
Definition SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition SpellAuras.h:108
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition PlayerUpdates.cpp:1025
Definition Unit.h:427
void SetProcCooldown(uint32 cooldown)
Definition Unit.h:461
Unit * GetActionTarget() const
Definition Unit.h:447
Unit * GetProcTarget() const
Definition Unit.h:448
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition Unit.cpp:9137
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition Unit.cpp:17820
bool IsHunterPet() const
Definition Unit.h:788
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition Unit.cpp:17667
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition Unit.cpp:8942
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition Unit.h:1321
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition Unit.cpp:6816
void StartReactiveTimer(ReactiveType reactive)
Definition Unit.h:1834
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition Unit.cpp:10040
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition Unit.cpp:17909
Definition Unit.cpp:16056

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
12102{
12103 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
12104 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
12105
12106 // .. taken pct: dummy auras
12107 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
12108 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
12109 {
12110 if (!(*i) || !(*i)->GetSpellInfo())
12111 {
12112 continue;
12113 }
12114
12115 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
12116 {
12117 switch (spellIconId)
12118 {
12119 // Cheat Death
12120 case 2109:
12121 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
12122 {
12123 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
12124 // is 22.5% critical strike damage reduction, or 444 resilience.
12125 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
12126 float mod = -1.0f * GetMeleeCritDamageReduction(400);
12127 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
12128 }
12129 break;
12130 }
12131 }
12132 }
12133 return TakenTotalMod;
12134}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4311{
4314}
virtual void ProcessTerrainStatusUpdate()
Definition Unit.cpp:4316
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition Object.cpp:1164

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4317{
4318 if (IsCreature())
4320
4321 if (IsFlying() || (!IsControlledByPlayer()))
4322 return;
4323
4324 LiquidData const& liquidData = GetLiquidData();
4325
4326 // remove appropriate auras if we are swimming/not swimming respectively - exact mirror of client logic
4327 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING && (liquidData.Level - GetPositionZ()) > GetCollisionHeight() * 0.75f) // Shallow water at ~75% of collision height)
4329 else
4331
4332 // liquid aura handling
4333 LiquidTypeEntry const* curLiquid = nullptr;
4334 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4335 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4336
4337 if (curLiquid != _lastLiquid)
4338 {
4341
4342 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4343 _lastLiquid = curLiquid;
4344
4346 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4347 CastSpell(this, curLiquid->SpellId, true);
4348 }
4349}
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition SpellDefines.h:51
void UpdateMovementFlags()
Definition Creature.cpp:3322
bool IsFlying() const
Definition Unit.h:1693
Definition GridTerrainData.h:199
float Level
Definition GridTerrainData.h:204
uint32 Entry
Definition GridTerrainData.h:202
Definition DBCStructure.h:1281
uint32 SpellId
Definition DBCStructure.h:1287

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCollisionHeight(), WorldObject::GetLiquidData(), Position::GetPositionZ(), IsControlledByPlayer(), Object::IsCreature(), IsFlying(), Player::IsGameMaster(), LiquidData::Level, MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1569{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline
void propagateSpeedChange()
Definition MotionMaster.cpp:926

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16987{
16989 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16990 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
16991 SetObjectScale(std::max(scale, scaleMin));
16992}
@ SPELL_AURA_MOD_SCALE_2
Definition SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition Object.h:120
virtual float GetNativeObjectScale() const
Definition Unit.h:1951

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )

Remove all units in m_attackers list and send them AttackStop()

10689{
10690 while (!m_attackers.empty())
10691 {
10692 AttackerSet::iterator iter = m_attackers.begin();
10693 if (!(*iter)->AttackStop())
10694 {
10695 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10696 m_attackers.erase(iter);
10697 }
10698 }
10699}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), boss_kaelthas::ExecuteMiddleEvent(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), boss_attumen::SpellHit(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5439{
5440 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5441 // we want to have all auras removed, so use your brain when linking events
5442 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5443 {
5444 AuraApplicationMap::iterator aurAppIter;
5445 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5447
5448 AuraMap::iterator aurIter;
5449 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5450 RemoveOwnedAura(aurIter);
5451 }
5452}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), boss_muru::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustReachedHome(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustReachedHome(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::OnRemove(), PretendToDie(), boss_alar::PretendToDie(), Creature::RemoveCorpse(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_bjarngrim::Reset(), boss_loken::Reset(), boss_hodir::boss_hodirAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5513{
5514 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5515 {
5516 Aura const* aura = iter->second->GetBase();
5517 if (aura->GetSpellInfo()->HasAura(type))
5518 ++iter;
5519 else
5521 }
5522
5523 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5524 {
5525 Aura* aura = iter->second;
5526 if (aura->GetSpellInfo()->HasAura(type))
5527 ++iter;
5528 else
5530 }
5531}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5469{
5470 // used just after dieing to remove all visible auras
5471 // and disable the mods for the passive ones
5472 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5473 {
5474 Aura const* aura = iter->second->GetBase();
5477 else
5478 ++iter;
5479 }
5480
5481 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5482 {
5483 Aura* aura = iter->second;
5486 else
5487 ++iter;
5488 }
5489}
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition SharedDefines.h:654
@ AURA_REMOVE_BY_DEATH
Definition SpellAuraDefines.h:396
bool IsDeathPersistent() const
Definition SpellAuras.cpp:1039

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5492{
5493 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5494 {
5495 Aura const* aura = iter->second->GetBase();
5496 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5498 else
5499 ++iter;
5500 }
5501
5502 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5503 {
5504 Aura* aura = iter->second;
5505 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5507 else
5508 ++iter;
5509 }
5510}
bool IsRequiringDeadTarget() const
Definition SpellInfo.cpp:1222

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11295{
11296 // possessed pet and vehicle
11297 if (IsPlayer())
11299
11300 while (!m_Controlled.empty())
11301 {
11302 Unit* target = *m_Controlled.begin();
11303 m_Controlled.erase(m_Controlled.begin());
11304 if (target->GetCharmerGUID() == GetGUID())
11305 {
11306 target->RemoveCharmAuras();
11307 }
11308 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11309 {
11310 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11311 {
11312 target->ToTempSummon()->UnSummon();
11313 }
11314 }
11315 else
11316 {
11317 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11318 }
11319 }
11320}
void StopCastingCharm(Aura *except=nullptr)
Definition Player.cpp:9384
bool IsGuardian() const
Definition Unit.h:785
void RemoveCharmAuras()
Definition Unit.cpp:11402

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6391{
6392 while (!m_dynObj.empty())
6393 m_dynObj.front()->Remove();
6394}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6491{
6492 while(!m_gameObj.empty())
6493 {
6494 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6495 if (go)
6496 {
6498 go->SetRespawnTime(0);
6499 go->Delete();
6500 }
6501 m_gameObj.erase(m_gameObj.begin());
6502 }
6503}
void Delete()
Definition GameObject.cpp:978
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1284

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
11068{
11069 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
11070 {
11071 Unit* unit = *itr;
11072 ++itr;
11073 if (unit->GetEntry() == entry && unit->IsCreature()
11074 && unit->ToCreature()->IsSummon()) // minion, actually
11075 unit->ToTempSummon()->UnSummon();
11076 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
11077 }
11078}

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4990{
4991 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4992 {
4993 if (check(iter->second))
4994 {
4995 RemoveAura(iter);
4996 continue;
4997 }
4998 ++iter;
4999 }
5000}

References m_appliedAuras, and RemoveAura().

Referenced by _RemoveNoStackAurasDueToAura(), and RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
5016{
5017 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5018 {
5019 if (check(iter->second))
5020 {
5021 RemoveAura(iter);
5022 continue;
5023 }
5024 ++iter;
5025 }
5026}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5406{
5407 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5408 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5409 {
5410 Aura* aura = iter->second;
5411 ++iter;
5412 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5413 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5414 {
5415 AuraApplication* aurApp = itr->second;
5416 ++itr;
5417 Unit* target = aurApp->GetTarget();
5418 if (target == this)
5419 continue;
5420 target->RemoveAura(aurApp);
5421 // things linked on aura remove may apply new area aura - so start from the beginning
5422 iter = m_ownedAuras.begin();
5423 }
5424 }
5425
5426 // remove area auras owned by others
5427 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5428 {
5429 if (iter->second->GetBase()->GetOwner() != this)
5430 {
5431 RemoveAura(iter);
5432 }
5433 else
5434 ++iter;
5435 }
5436}
ApplicationMap const & GetApplicationMap()
Definition SpellAuras.h:182
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5455{
5456 // in join, remove positive buffs, on end, remove negative
5457 // used to remove positive visible auras in arenas
5458 RemoveAppliedAuras([](AuraApplication const* aurApp)
5459 {
5460 Aura const* aura = aurApp->GetBase();
5461 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5462 && !aura->IsPassive() // don't remove passive auras
5463 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5464 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5465 });
5466}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition SharedDefines.h:580
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition SharedDefines.h:524
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition SharedDefines.h:562
bool IsPositive() const
Definition SpellAuras.h:68

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Battleground::AddPlayer().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4969{
4970 if (aura->IsRemoved())
4971 return;
4972 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4973 RemoveAura(aurApp, mode);
4974}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4926{
4927 // we've special situation here, RemoveAura called while during aura removal
4928 // this kind of call is needed only when aura effect removal handler
4929 // or event triggered by it expects to remove
4930 // not yet removed effects of an aura
4931 if (aurApp->GetRemoveMode())
4932 {
4933 // remove remaining effects of an aura
4934 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4935 {
4936 if (aurApp->HasEffect(itr))
4937 aurApp->_HandleEffect(itr, false);
4938 }
4939 return;
4940 }
4941 // no need to remove
4942 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4943 return;
4944
4945 uint32 spellId = aurApp->GetBase()->GetId();
4946 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4947
4948 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4949 {
4950 if (aurApp == iter->second)
4951 {
4952 // Prevent Arena Preparation aura from being removed by player actions
4953 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4954 // Should only be removed by the arena script, once the match starts.
4956 {
4957 return;
4958 }
4959
4960 RemoveAura(iter, mode);
4961 return;
4962 }
4963 else
4964 ++iter;
4965 }
4966}
@ SPELL_AURA_ARENA_PREPARATION
Definition SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4896{
4897 AuraApplication* aurApp = i->second;
4898 // Do not remove aura which is already being removed
4899 if (aurApp->GetRemoveMode())
4900 return;
4901 Aura* aura = aurApp->GetBase();
4902 _UnapplyAura(i, mode);
4903 // Remove aura - for Area and Target auras
4904 if (aura->GetOwner() == this)
4905 aura->Remove(mode);
4906}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_headless_horseman::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), npc_harrison_jones::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::boss_vezaxAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DoAction(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::DoAction(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), Spell::finish(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_valanar_kinetic_bomb_aura::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_bloodspore_haze::HandleEffectHit(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::HandleScript(), spell_handover_reins::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), IsHighestExclusiveAuraEffect(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), boss_loken::OnAuraRemove(), spell_blood_queen_vampiric_bite::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAura(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::RemoveStanceAura(), boss_gyth::boss_gythAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), boss_anomalus::SetData(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_malygos::boss_malygosAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::boss_sartharion_shadronAI::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4909{
4910 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4911 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4912 {
4913 Aura const* aura = iter->second->GetBase();
4914 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4915 && (!caster || aura->GetCasterGUID() == caster))
4916 {
4917 RemoveAura(iter, removeMode);
4918 return;
4919 }
4920 else
4921 ++iter;
4922 }
4923}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
5045{
5046 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5047 for (AuraMap::iterator iter = range.first; iter != range.second;)
5048 {
5049 Aura* aura = iter->second;
5050 if ((aura->GetType() == UNIT_AURA_TYPE)
5051 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
5052 {
5053 aura->ModStackAmount(-1, removeMode);
5054 return;
5055 }
5056 else
5057 ++iter;
5058 }
5059}
@ UNIT_AURA_TYPE
Definition SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition SpellAuras.cpp:963
AuraObjectType GetType() const
Definition SpellAuras.cpp:420

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_selin_fireheart::JustEngagedWith(), and boss_viscidus::SpellHit().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5390{
5391 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5392 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5393 {
5394 Aura const* aura = iter->second->GetBase();
5395 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5397 {
5398 RemoveAura(iter);
5399 continue;
5400 }
5401 ++iter;
5402 }
5403}
@ SPELL_ATTR0_CU_AURA_CC
Definition SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition SpellInfo.cpp:1883

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5230{
5231 // simple check if list is empty
5232 if (m_modAuras[auraType].empty())
5233 return;
5234
5235 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5236 {
5237 Aura* aura = (*iter)->GetBase();
5239
5240 ++iter;
5241 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5242 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5243 {
5244 uint32 removedAuras = m_removedAurasCount;
5245 RemoveAura(aurApp);
5246 if (m_removedAurasCount > removedAuras)
5247 iter = m_modAuras[auraType].begin();
5248 }
5249 }
5250}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Attack(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), spell_gen_summon_tournament_mount::CheckIfLanceEquipped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), boss_gurtogg_bloodboil::JustEngagedWith(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5205{
5206 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5207 {
5208 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5209 {
5210 RemoveAura(iter);
5211 iter = m_appliedAuras.lower_bound(spellId);
5212 }
5213 else
5214 ++iter;
5215 }
5216
5217 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5218 {
5219 if (iter->second->GetCastItemGUID() == castItemGuid)
5220 {
5222 iter = m_ownedAuras.lower_bound(spellId);
5223 }
5224 else
5225 ++iter;
5226 }
5227}

References AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, RemoveAura(), and RemoveOwnedAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
5029{
5030 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5031 {
5032 Aura const* aura = iter->second->GetBase();
5033 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5034 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
5035 {
5036 RemoveAura(iter, removeMode);
5037 iter = m_appliedAuras.lower_bound(spellId);
5038 }
5039 else
5040 ++iter;
5041 }
5042}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), Player::ApplyItemObtainSpells(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_wild_wyrm::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_frozen_core::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), boss_alar::DoDiveBomb(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_zuljin::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_mother_shahraz_fatal_attraction_dummy::FilterTargets(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), spell_amanitar_remove_mushroom_power::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), group_commandscript::HandleGroupReviveCommand(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldState::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_eject_passenger_wild_wyrm::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_zuljin::JustEngagedWith(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_tenris_mirkblood::KilledUnit(), boss_felblood_kaelthas::LapseAction(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), spell_claw_rage_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), npc_wild_wyrm::PassengerBoarded(), npc_preparations_for_war_vehicle::PassengerBoarded(), boss_jeklik::PathEndReached(), spell_quest_test_flight_charging::PerformKick(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_kiljaeden::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_Graveyard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), npc_akama_shade::sGossipSelect(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), advisor_baseAI::SpellHit(), boss_anub_arak::SpellHitTarget(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::SummonedCreatureDies(), boss_anub_arak::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
5062{
5063 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5064 for (AuraMap::iterator iter = range.first; iter != range.second;)
5065 {
5066 Aura* aura = iter->second;
5067 if (aura->GetCasterGUID() == casterGUID)
5068 {
5069 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
5070
5071 // Call OnDispel hook on AuraScript
5072 aura->CallScriptDispel(&dispelInfo);
5073
5075 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5076 else
5077 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5078
5079 // Call AfterDispel hook on AuraScript
5080 aura->CallScriptAfterDispel(&dispelInfo);
5081
5082 switch (aura->GetSpellInfo()->SpellFamilyName)
5083 {
5084 case SPELLFAMILY_HUNTER:
5085 {
5086 // Noxious Stings
5087 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
5088 {
5089 if (Unit* caster = aura->GetCaster())
5090 {
5091 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
5092 {
5093 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
5094 {
5095 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
5096 if (aura->GetUnitOwner())
5097 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
5098 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
5099 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
5100 }
5101 }
5102 }
5103 }
5104 break;
5105 }
5107 {
5108 // Icy Clutch, remove with Frost Fever
5109 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
5110 {
5111 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
5112 RemoveAurasDueToSpell(aureff->GetId());
5113 }
5114 }
5115 default:
5116 break;
5117 }
5118 return;
5119 }
5120 else
5121 ++iter;
5122 }
5123}
void CallScriptDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2314
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition SpellAuras.cpp:291
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition SpellAuras.cpp:915
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2327
Definition Unit.h:303

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
5126{
5127 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5128 for (AuraMap::iterator iter = range.first; iter != range.second;)
5129 {
5130 Aura* aura = iter->second;
5131 if (aura->GetCasterGUID() == casterGUID)
5132 {
5133 int32 damage[MAX_SPELL_EFFECTS];
5134 int32 baseDamage[MAX_SPELL_EFFECTS];
5135 uint8 effMask = 0;
5136 uint8 recalculateMask = 0;
5137 Unit* caster = aura->GetCaster();
5138 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5139 {
5140 if (aura->GetEffect(i))
5141 {
5142 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
5143 damage[i] = aura->GetEffect(i)->GetAmount();
5144 effMask |= (1 << i);
5145 if (aura->GetEffect(i)->CanBeRecalculated())
5146 recalculateMask |= (1 << i);
5147 }
5148 else
5149 {
5150 baseDamage[i] = 0;
5151 damage[i] = 0;
5152 }
5153 }
5154
5156 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
5157 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
5158
5159 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
5160 {
5161 if (stealCharge)
5162 oldAura->ModCharges(1);
5163 else
5164 oldAura->ModStackAmount(1);
5165 oldAura->SetDuration(int32(dur));
5166 }
5167 else
5168 {
5169 // single target state must be removed before aura creation to preserve existing single target aura
5170 if (aura->IsSingleTarget())
5171 aura->UnregisterSingleTarget();
5172
5173 // Xinef: if stealer has same aura
5174 Aura* curAura = stealer->GetAura(aura->GetId());
5175 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5176 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5177 {
5178 // created aura must not be single target aura,, so stealer won't loose it on recast
5179 if (newAura->IsSingleTarget())
5180 {
5181 newAura->UnregisterSingleTarget();
5182 // bring back single target aura status to the old aura
5183 aura->SetIsSingleTarget(true);
5184 caster->GetSingleCastAuras().push_back(aura);
5185 }
5186 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5187 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5188 newAura->ApplyForTargets();
5189 }
5190 }
5191
5192 if (stealCharge)
5194 else
5196
5197 return;
5198 }
5199 else
5200 ++iter;
5201 }
5202}
bool CanBeRecalculated() const
Definition SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition SpellAuras.cpp:1119
bool IsPermanent() const
Definition SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5253{
5254 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5255 {
5256 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5257 if (spell->Attributes & flags)
5258 RemoveAura(iter);
5259 else
5260 ++iter;
5261 }
5262}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5336{
5337 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5338 {
5339 Aura const* aura = iter->second->GetBase();
5340 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5341 {
5342 SpellInfo const* spell = aura->GetSpellInfo();
5343 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5344 {
5345 RemoveAura(iter);
5346 continue;
5347 }
5348 }
5349 ++iter;
5350 }
5351}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5301{
5302 if (!(m_interruptMask & flag))
5303 return;
5304
5305 // interrupt auras
5306 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5307 {
5308 Aura* aura = (*iter)->GetBase();
5309 ++iter;
5310 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5311 {
5312 uint32 removedAuras = m_removedAurasCount;
5313 RemoveAura(aura);
5314 if (m_removedAurasCount > removedAuras + 1)
5315 iter = m_interruptableAuras.begin();
5316 }
5317 }
5318
5319 // interrupt channeled spell
5321 {
5322 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5323 {
5324 // Do not interrupt if auto shot
5325 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5326 {
5327 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5328 }
5329 }
5330 }
5331
5333}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMoverRelocation(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), WorldSession::ProcessMovementInfo(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5373{
5374 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5375 {
5376 Aura const* aura = iter->second->GetBase();
5377 if (!except || aura->GetId() != except)
5378 {
5379 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5380 {
5381 RemoveAura(iter, removemode);
5382 continue;
5383 }
5384 }
5385 ++iter;
5386 }
5387}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11398{
11400}
@ SPELL_AURA_BIND_SIGHT
Definition SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18800{
18801 if (!IsCharmed())
18802 return;
18803
18804 if (!charmer)
18805 charmer = GetCharmer();
18806 if (charmer != GetCharmer()) // one aura overrides another?
18807 {
18808 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18809 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18810 // ABORT();
18811 return;
18812 }
18813
18814 CharmType type;
18816 type = CHARM_TYPE_POSSESS;
18817 else if (charmer && charmer->IsOnVehicle(this))
18818 type = CHARM_TYPE_VEHICLE;
18819 else
18820 type = CHARM_TYPE_CHARM;
18821
18822 if (_oldFactionId)
18823 {
18825 _oldFactionId = 0;
18826 }
18827 else
18829
18830 CastStop();
18831 AttackStop();
18832
18833 // xinef: update speed after charming
18834 UpdateSpeed(MOVE_RUN, false);
18835
18836 // xinef: do not break any controlled motion slot
18837 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18838 {
18839 StopMoving();
18841 }
18842 // xinef: if we have any controlled movement, clear active and idle only
18843 else
18845
18847
18848 // xinef: remove stunned flag if owner was mounted
18851
18852 // If charmer still exists
18853 if (!charmer)
18854 return;
18855
18856 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18857 ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle()));
18858
18859 charmer->SetCharm(this, false);
18860
18862
18863 Player* playerCharmer = charmer->ToPlayer();
18864 if (playerCharmer)
18865 {
18866 switch (type)
18867 {
18868 case CHARM_TYPE_VEHICLE:
18869 playerCharmer->SetClientControl(this, false);
18870 playerCharmer->SetClientControl(charmer, true); // verified
18873 break;
18874 case CHARM_TYPE_POSSESS:
18875 playerCharmer->SetClientControl(this, false);
18876 playerCharmer->SetClientControl(charmer, true); // verified
18881 break;
18882 case CHARM_TYPE_CHARM:
18884 {
18886 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18887 {
18889 if (GetCharmInfo())
18890 GetCharmInfo()->SetPetNumber(0, true);
18891 else
18892 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18893 }
18894 }
18895 break;
18896 default:
18897 break;
18898 }
18899 }
18900
18901 if (Player* player = ToPlayer())
18902 {
18903 sScriptMgr->AnticheatSetUnderACKmount(player);
18904 }
18905
18906 // xinef: restore threat
18907 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18908 {
18909 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18910 if (!IsFriendlyTo(target))
18911 AddThreat(target, itr->second);
18912 }
18913
18914 _charmThreatInfo.clear();
18915
18916 if (Creature* creature = ToCreature())
18917 {
18918 // Vehicle should not attack its passenger after he exists the seat
18919 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18920 if (Attack(charmer, true))
18921 GetMotionMaster()->MoveChase(charmer);
18922
18923 // Creature will restore its old AI on next update
18924 if (creature->AI())
18925 creature->AI()->OnCharmed(false);
18926
18927 // Xinef: Remove movement flag flying
18929 }
18930 else
18931 ToPlayer()->SetClientControl(this, true); // verified
18932
18933 // a guardian should always have charminfo
18934 if (playerCharmer && this != charmer->GetFirstControlled())
18935 playerCharmer->SendRemoveControlBar();
18936
18937 // xinef: Always delete charm info (restores react state)
18938 if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian()))
18940}
CharmType
Definition CharmInfo.h:44
@ CHARM_TYPE_CHARM
Definition CharmInfo.h:45
@ CHARM_TYPE_POSSESS
Definition CharmInfo.h:46
@ CHARM_TYPE_VEHICLE
Definition CharmInfo.h:47
@ MOTION_SLOT_CONTROLLED
Definition MotionMaster.h:65
@ MOTION_SLOT_ACTIVE
Definition MotionMaster.h:64
@ NULL_MOTION_TYPE
Definition MotionMaster.h:58
@ CREATURE_TYPE_DEMON
Definition SharedDefines.h:2641
@ CLASS_CONTEXT_PET_CHARM
Definition UnitDefines.h:241
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition UnitDefines.h:198
@ MOVE_RUN
Definition UnitDefines.h:354
void InitDefault()
Definition MotionMaster.cpp:88
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition MotionMaster.h:219
void MovementExpired(bool reset=true)
Definition MotionMaster.h:205
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:739
void SendRemoveControlBar()
Definition Player.cpp:9785
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition Player.cpp:12897
void DeleteCharmInfo()
Definition Unit.cpp:16040
void RestoreFaction()
Definition Unit.cpp:18942
void SetCharm(Unit *target, bool apply)
Definition Unit.cpp:11080
void StopAttackingInvalidTarget()
Definition Unit.cpp:20178
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition Unit.cpp:1187
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:10451
CharmThreatMap _charmThreatInfo
Definition Unit.h:2178
void RemoveUnitMovementFlag(uint32 f)
Definition Unit.h:763
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition Unit.cpp:14414
uint32 unit_class
Definition CreatureData.h:213

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), Object::IsCreature(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
1009{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6369{
6370 if (m_dynObj.empty())
6371 return false;
6372
6373 bool result = false;
6374 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6375 {
6376 DynamicObject* dynObj = *i;
6377 if (dynObj->GetSpellId() == spellId)
6378 {
6379 dynObj->Remove();
6380 i = m_dynObj.begin();
6381 result = true;
6382 }
6383 else
6384 ++i;
6385 }
6386
6387 return result;
6388}
void Remove()
Definition DynamicObject.cpp:180

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5557{
5558 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5559 {
5560 Aura const* aura = iter->second->GetBase();
5561 SpellInfo const* spellInfo = aura->GetSpellInfo();
5563 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5564 ++iter;
5565 else
5567 }
5568
5569 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5570 {
5571 Aura* aura = iter->second;
5572 SpellInfo const* spellInfo = aura->GetSpellInfo();
5574 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5575 ++iter;
5576 else
5578 }
5579}
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition SharedDefines.h:455
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition SpellInfo.h:187

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), ObjectGuid::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
1874{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from Object.

15918{
15919 // cleanup
15920 ASSERT(GetGUID());
15921
15922 if (IsInWorld())
15923 {
15925 if (IsVehicle())
15927
15931
15934
15935 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15938
15940
15941 if (GetCharmerGUID())
15942 {
15943 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15944 ABORT();
15945 }
15946
15947 if (Unit* owner = GetOwner())
15948 {
15949 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15950 {
15952 owner->SetMinion((Minion*)this, false);
15953 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15954 //ABORT();
15955 }
15956 }
15957
15960 }
15961}
void RemoveNotOwnSingleTargetAuras()
Definition Unit.cpp:5264
void UnsummonAllTotems(bool onDeath=false)
Definition Unit.cpp:11410
void RemoveAllDynObjects()
Definition Unit.cpp:6390
void RemoveAreaAurasDueToLeaveWorld()
Definition Unit.cpp:5405
void RemoveBindSightAuras()
Definition Unit.cpp:11397
void RemoveAllControlled(bool onDeath=false)
Definition Unit.cpp:11294
void RemoveFromWorld() override
Definition Object.cpp:1200

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6425{
6426 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6427 return;
6428
6430
6431 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6432 {
6433 if (m_ObjectSlot[i] == gameObj->GetGUID())
6434 {
6435 m_ObjectSlot[i].Clear();
6436 break;
6437 }
6438 }
6439
6440 // GO created by some spell
6441 if (uint32 spellid = gameObj->GetSpellId())
6442 {
6443 RemoveAurasDueToSpell(spellid);
6444
6445 if (IsPlayer())
6446 {
6447 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6448 // Need activate spell use for owner
6449 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6450 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6451 ToPlayer()->SendCooldownEvent(createBySpell);
6452 }
6453 }
6454
6455 m_gameObj.remove(gameObj->GetGUID());
6456
6457 if (del)
6458 {
6459 gameObj->SetRespawnTime(0);
6460 gameObj->Delete();
6461 }
6462}
void Clear()
Definition ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition Player.cpp:11131

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::boss_kologarnAI::JustDied(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6465{
6466 if (m_gameObj.empty())
6467 return;
6468
6469 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6470 {
6471 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6472 {
6473 if (spellid > 0 && go->GetSpellId() != spellid)
6474 {
6475 ++itr;
6476 continue;
6477 }
6478
6479 go->SetOwnerGUID(ObjectGuid::Empty);
6480 if (del)
6481 {
6482 go->SetRespawnTime(0);
6483 go->Delete();
6484 }
6485 }
6486 m_gameObj.erase(itr++);
6487 }
6488}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
946{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5354{
5355 if (withRoot)
5357
5358 // Snares
5359 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5360 {
5361 Aura const* aura = iter->second->GetBase();
5363 {
5364 RemoveAura(iter);
5365 continue;
5366 }
5367
5368 ++iter;
5369 }
5370}
bool HasEffectMechanic(Mechanics mechanic) const
Definition SpellInfo.cpp:884

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5265{
5266 // single target auras from other casters
5267 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5268 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5269 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5270 // leading to assertion failures if the aura was cast on a player that can
5271 // (and is changing map at the point where this function is called).
5272 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5273 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5274 // to register in m_appliedAuras
5275 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5276 {
5277 Aura const* aura = iter->second;
5278
5279 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5280 RemoveOwnedAura(iter);
5281 else
5282 ++iter;
5283 }
5284
5285 // single target auras at other targets
5286 AuraList& scAuras = GetSingleCastAuras();
5287 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5288 {
5289 Aura* aura = *iter;
5290 if (aura->GetUnitOwner() != this)
5291 {
5292 aura->Remove();
5293 iter = scAuras.begin();
5294 }
5295 else
5296 ++iter;
5297 }
5298}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
755{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_akama_illidan::DoAction(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::EndBattle(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), instance_violet_hold::instance_violet_hold_InstanceMapScript::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_deathstalker_fearleia::sQuestAccept(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::StartBattle(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), and Vehicle::Vehicle().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4858{
4859 if (aura->IsRemoved())
4860 return;
4861
4862 ASSERT(aura->GetOwner() == this);
4863
4864 uint32 spellId = aura->GetId();
4865 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4866
4867 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4868 {
4869 if (itr->second == aura)
4870 {
4871 RemoveOwnedAura(itr, removeMode);
4872 return;
4873 }
4874 }
4875
4876 ABORT();
4877}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4825{
4826 Aura* aura = i->second;
4827 ASSERT(!aura->IsRemoved());
4828
4829 // if unit currently update aura list then make safe update iterator shift to next
4832
4833 m_ownedAuras.erase(i);
4834 m_removedAuras.push_back(aura);
4835
4836 // Unregister single target aura
4837 if (aura->IsSingleTarget())
4838 aura->UnregisterSingleTarget();
4839
4840 aura->_Remove(removeMode);
4841
4842 i = m_ownedAuras.begin();
4843}
void _Remove(AuraRemoveMode removeMode)
Definition SpellAuras.cpp:513

References Aura::_Remove(), ASSERT, Aura::IsRemoved(), Aura::IsSingleTarget(), m_auraUpdateIterator, m_ownedAuras, m_removedAuras, and Aura::UnregisterSingleTarget().

Referenced by Player::_removeTalentAurasAndSpells(), _UpdateSpells(), Player::ActivateSpec(), Spell::EffectApplyGlyph(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandleRemoveGlyph(), AuraEffect::HandleShapeshiftBoosts(), boss_zuljin::JustEngagedWith(), spell_gen_animal_blood::OnApply(), spell_contagion_of_rot::OnApply(), UnitAura::Remove(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAurasDueToItemSpell(), RemoveEvadeAuras(), Player::RemoveItemDependentAurasAndCasts(), RemoveNotOwnSingleTargetAuras(), RemoveOwnedAura(), RemoveOwnedAura(), RemoveOwnedAuras(), RemoveOwnedAuras(), Player::removeSpell(), boss_falric::boss_falricAI::UpdateAI(), and Player::UpdateAreaDependentAuras().

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4846{
4847 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4848 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4849 {
4850 RemoveOwnedAura(itr, removeMode);
4851 itr = m_ownedAuras.lower_bound(spellId);
4852 }
4853 else
4854 ++itr;
4855}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4977{
4978 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4979 {
4980 if (check(iter->second))
4981 {
4982 RemoveOwnedAura(iter);
4983 continue;
4984 }
4985 ++iter;
4986 }
4987}

References m_ownedAuras, and RemoveOwnedAura().

Referenced by _RemoveNoStackAurasDueToAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
5003{
5004 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5005 {
5006 if (check(iter->second))
5007 {
5008 RemoveOwnedAura(iter);
5009 continue;
5010 }
5011 ++iter;
5012 }
5013}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17554{
17555 if (!IsPlayer())
17556 return;
17557
17558 m_petAuras.erase(petSpell);
17559 if (Pet* pet = ToPlayer()->GetPet())
17560 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17561 if (Unit* charm = GetCharm())
17562 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17563}

References PetAura::GetAura(), GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
Todo:
: This isn't right, if a previously active object was set to active with e.g. Mind Vision this will make them no longer active
11388{
11389 m_sharedVision.remove(player);
11390 player->m_isInSharedVisionOf.erase(this);
11391
11393 if (m_sharedVision.empty())
11394 setActive(false);
11395}

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition UnitDefines.h:25
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition Object.cpp:912

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

739{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by at_hol_hall_of_watchers::_OnTrigger(), spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), boss_alar::DamageTaken(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_the_lurker_below::DoAction(), npc_frozen_core::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_kiljaeden::InitializeAI(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), boss_kalecgos::Reset(), boss_kiljaeden::Reset(), boss_muru::Reset(), npc_harrison_jones::Reset(), npc_amanishi_lookout::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_crystalline_frayer::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_mimiron::boss_mimironAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), boss_kaelthas::Reset(), advisor_baseAI::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), Player::SetBeastMaster(), SetCharm(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SetData(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SpellHit(), npc_ulduar_vx001::npc_ulduar_vx001AI::SpellHit(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), advisor_baseAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )
18975{
18976 if (!m_vehicleKit)
18977 return;
18978
18980 delete m_vehicleKit;
18981
18982 m_vehicleKit = nullptr;
18983
18984 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18985 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18987}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:343
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition UnitDefines.h:344
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:755

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1533{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition Unit.cpp:17413

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), npc_wild_wyrm::DamageTaken(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), GameEventMgr::UpdateEventNPCFlags(), and npc_captain_saeed::npc_captain_saeedAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RespondsToCallForHelp()

bool Unit::RespondsToCallForHelp ( ) const
inline
1022 {
1023 if (FactionTemplateEntry const* entry = GetFactionTemplateEntry())
1024 return entry->FactionRespondsToCallForHelp();
1025
1026 return false;
1027 }

References GetFactionTemplateEntry().

Referenced by Creature::CanAssistTo().

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
17008{
17009 AuraEffect* handledAura = nullptr;
17010 AuraEffect* handledAuraForced = nullptr;
17011 // try to receive model from transform auras
17013 if (!transforms.empty())
17014 {
17015 // iterate over already applied transform auras - from newest to oldest
17016 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
17017 {
17018 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
17019 {
17020 if (!handledAura)
17021 handledAura = (*i);
17022 // xinef: prefer negative/forced auras
17023 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
17024 {
17025 handledAuraForced = (*i);
17026 break;
17027 }
17028 }
17029 }
17030 }
17031
17032 // Xinef: include clone auras (eg mirror images)
17033 if (!handledAuraForced && !handledAura)
17034 {
17036 if (!cloneAuras.empty())
17037 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
17038 handledAura = *i;
17039 }
17040
17042
17043 // xinef: order of execution is important!
17044 // first forced transform auras, then shapeshifts, then normal transform
17045 // transform aura was found
17046 if (handledAuraForced)
17047 {
17048 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
17049 return;
17050 }
17051 else if (!shapeshiftAura.empty()) // we've found shapeshift
17052 {
17053 // only one such aura possible at a time
17054 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
17055 {
17056 SetDisplayId(modelId);
17057 return;
17058 }
17059 }
17060 else if (handledAura)
17061 {
17062 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
17063 return;
17064 }
17065
17066 // no auras found - set modelid to default
17068}
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition SpellAuraDefines.h:43
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition SpellAuraEffects.cpp:756
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId)
Definition Unit.cpp:19445

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18943{
18944 if (IsPlayer())
18946 else
18947 {
18949 {
18950 if (Unit* owner = GetOwner())
18951 {
18952 SetFaction(owner->GetFaction());
18953 return;
18954 }
18955 }
18956
18957 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18958 SetFaction(cinfo->faction);
18959 }
18960}
void SetFactionForRace(uint8 race)
Definition Player.cpp:5919

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16897{
16898 if (slot >= MAX_MOTION_SLOT)
16899 return;
16900
16901 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16902 movementGenerator->Resume(timer);
16903}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
20112{
20113 // Rage formulae https://wowwiki-archive.fandom.com/wiki/Rage#Formulae
20114 float addRage;
20115
20116 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
20117
20118 // Unknown if correct, but lineary adjust rage conversion above level 70
20119 if (GetLevel() > 70)
20120 rageconversion += 13.27f * (GetLevel() - 70);
20121
20122 if (attacker)
20123 {
20124 // see Bornak's bluepost explanation (05/29/2009)
20125 float rageFromDamageDealt = damage / rageconversion * 7.5f;
20126 addRage = (rageFromDamageDealt + weaponSpeedHitFactor) / 2.0f;
20127 addRage = std::min(addRage, rageFromDamageDealt * 2.0f);
20129 }
20130 else
20131 {
20132 addRage = damage / rageconversion * 2.5f;
20133
20134 // Berserker Rage effect
20135 if (HasAura(18499))
20136 addRage *= 3.0f;
20137 }
20138
20139 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
20140
20141 ModifyPower(POWER_RAGE, uint32(addRage * 10));
20142}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition WorldConfig.h:392

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage(), and DealMeleeDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2822{
2823 // This is only wrapper
2824
2825 // Miss chance based on melee
2826 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2827 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2828
2829 // Critical hit chance
2830 float crit_chance = GetUnitCriticalChance(attType, victim);
2831 if (crit_chance < 0)
2832 crit_chance = 0;
2833
2834 float dodge_chance = victim->GetUnitDodgeChance();
2835 float block_chance = victim->GetUnitBlockChance();
2836 float parry_chance = victim->GetUnitParryChance();
2837
2838 // Useful if want to specify crit & miss chances for melee, else it could be removed
2839 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2840
2841 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2842}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition Unit.cpp:3757

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2845{
2846 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())
2847 {
2848 return MELEE_HIT_EVADE;
2849 }
2850
2851 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2852 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2853
2854 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2855 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2856
2857 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2858
2859 // bonus from skills is 0.04%
2860 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2861 int32 sum = 0, tmp = 0;
2862 int32 roll = urand (0, 10000);
2863
2864 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2865 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2866 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2867
2868 tmp = miss_chance;
2869
2870 if (tmp > 0 && roll < (sum += tmp))
2871 {
2872 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2873 return MELEE_HIT_MISS;
2874 }
2875
2876 // Dodge chance
2877
2878 // only players can't dodge if attacker is behind
2879 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2880 {
2881 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2882 }
2883 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2884 else if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_DODGE)))
2885 {
2886 // Reduce dodge chance by attacker expertise rating
2887 if (IsPlayer())
2888 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2889 else
2890 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2891
2892 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2894 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2895
2896 tmp = dodge_chance;
2897
2898 // xinef: if casting or stunned - cant dodge
2899 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2900 tmp = 0;
2901
2902 if ((tmp > 0) // check if unit _can_ dodge
2903 && ((tmp -= skillBonus) > 0)
2904 && roll < (sum += tmp))
2905 {
2906 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2907 return MELEE_HIT_DODGE;
2908 }
2909 }
2910
2911 // parry & block chances
2912
2913 // check if attack comes from behind, nobody can parry or block if attacker is behind
2914 if (!victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2915 {
2916 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2917 }
2918 else
2919 {
2920 // Reduce parry chance by attacker expertise rating
2921 if (IsPlayer())
2922 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2923 else
2924 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2925
2926 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_PARRY)))
2927 {
2928 tmp = parry_chance;
2929
2930 // xinef: cant parry while casting or while stunned
2931 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2932 tmp = 0;
2933
2934 if (tmp > 0 // check if unit _can_ parry
2935 && (tmp -= skillBonus) > 0
2936 && roll < (sum += tmp))
2937 {
2938 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2939 return MELEE_HIT_PARRY;
2940 }
2941 }
2942
2943 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_BLOCK)))
2944 {
2945 tmp = block_chance;
2946
2947 // xinef: cant block while casting or while stunned
2948 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2949 tmp = 0;
2950
2951 if (tmp > 0 // check if unit _can_ block
2952 && (tmp -= skillBonus) > 0
2953 && roll < (sum += tmp))
2954 {
2955 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2956 return MELEE_HIT_BLOCK;
2957 }
2958 }
2959 }
2960
2961 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2962 if (attType != RANGED_ATTACK &&
2963 (IsPlayer() || IsPet()) &&
2964 !victim->IsPlayer() && !victim->IsPet() &&
2965 GetLevel() < victim->getLevelForTarget(this))
2966 {
2967 // cap possible value (with bonuses > max skill)
2968 int32 skill = attackerWeaponSkill;
2969 int32 maxskill = attackerMaxSkillValueForLevel;
2970 skill = (skill > maxskill) ? maxskill : skill;
2971
2972 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2973 tmp = tmp > 4000 ? 4000 : tmp;
2974 if (roll < (sum += tmp))
2975 {
2976 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2977 return MELEE_HIT_GLANCING;
2978 }
2979 }
2980
2981 // mobs can score crushing blows if they're 4 or more levels above victim
2982 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2983 // can be from by creature (if can) or from controlled player that considered as creature
2986 {
2987 // when their weapon skill is 15 or more above victim's defense skill
2988 tmp = victimDefenseSkill;
2989 int32 tmpmax = victimMaxSkillValueForLevel;
2990 // having defense above your maximum (from items, talents etc.) has no effect
2991 tmp = tmp > tmpmax ? tmpmax : tmp;
2992 // tmp = mob's level * 5 - player's current defense skill
2993 tmp = attackerMaxSkillValueForLevel - tmp;
2994 if (tmp >= 15)
2995 {
2996 // add 2% chance per lacking skill point, min. is 15%
2997 tmp = tmp * 200 - 1500;
2998 if (roll < (sum += tmp))
2999 {
3000 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
3001 return MELEE_HIT_CRUSHING;
3002 }
3003 }
3004 }
3005
3006 // Critical chance
3007 tmp = crit_chance;
3008
3009 if (tmp > 0 && roll < (sum += tmp))
3010 {
3011 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
3012 if (IsCreature() && (ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_CRIT)))
3013 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
3014 else
3015 return MELEE_HIT_CRIT;
3016 }
3017
3018 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
3019 return MELEE_HIT_NORMAL;
3020}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition CreatureData.h:50
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition CreatureData.h:62

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetWeaponSkillValue(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21290{
21291 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21292}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17252{
17253 std::list<Unit*> targets;
17254 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17256 Cell::VisitObjects(this, searcher, dist);
17257
17258 // remove current target
17259 if (GetVictim())
17260 targets.remove(GetVictim());
17261
17262 if (exclude)
17263 targets.remove(exclude);
17264
17265 // remove not LoS targets
17266 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17267 {
17268 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17269 {
17270 std::list<Unit*>::iterator tIter2 = tIter;
17271 ++tIter;
17272 targets.erase(tIter2);
17273 }
17274 else
17275 ++tIter;
17276 }
17277
17278 // no appropriate targets
17279 if (targets.empty())
17280 return nullptr;
17281
17282 // select random
17284}
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition Unit.cpp:14029
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:133
Definition GridNotifiers.h:414

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17217{
17218 std::list<Unit*> targets;
17219 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
17221 Cell::VisitObjects(this, searcher, dist);
17222
17223 // remove current target
17224 if (GetVictim())
17225 targets.remove(GetVictim());
17226
17227 if (exclude)
17228 targets.remove(exclude);
17229
17230 // remove not LoS targets
17231 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17232 {
17233 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17234 {
17235 std::list<Unit*>::iterator tIter2 = tIter;
17236 ++tIter;
17237 targets.erase(tIter2);
17238 }
17239 else
17240 ++tIter;
17241 }
17242
17243 // no appropriate targets
17244 if (targets.empty())
17245 return nullptr;
17246
17247 // select random
17249}
Definition GridNotifiers.h:852

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_yazzai::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::npc_hodirs_furyAI::UpdateAI(), npc_storm_beacon_spawn::npc_storm_beacon_spawnAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6707{
6708 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6709
6710 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6711 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6712 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6713 {
6714 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6715 tmpDamage[i] = damageInfo->damages[i].damage;
6716 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6717 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6718 {
6719 tmpAbsorb[i] = tmpDamage[i];
6720 tmpDamage[i] = 0;
6721 }
6722 }
6723
6724 uint32 count = 1;
6725 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6726 {
6727 ++count;
6728 }
6729
6730 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6731 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6732 data << uint32(damageInfo->HitInfo);
6733 data << damageInfo->attacker->GetPackGUID();
6734 data << damageInfo->target->GetPackGUID();
6735 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6736 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6737 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6738 data << uint8(count); // Sub damage count
6739
6740 for (uint32 i = 0; i < count; ++i)
6741 {
6742 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6743 data << float(tmpDamage[i]); // sub damage
6744 data << uint32(tmpDamage[i]); // Sub Damage
6745 }
6746
6748 {
6749 for (uint32 i = 0; i < count; ++i)
6750 {
6751 data << uint32(tmpAbsorb[i]); // Absorb
6752 }
6753 }
6754
6756 {
6757 for (uint32 i = 0; i < count; ++i)
6758 {
6759 data << uint32(damageInfo->damages[i].resist); // Resist
6760 }
6761 }
6762
6763 data << uint8(damageInfo->TargetState);
6764 data << uint32(0); // Unknown attackerstate
6765 data << uint32(0); // Melee spellid
6766
6767 if (damageInfo->HitInfo & HITINFO_BLOCK)
6768 data << uint32(damageInfo->blocked_amount);
6769
6770 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6771 data << uint32(0);
6772
6774 if (damageInfo->HitInfo & HITINFO_UNK1)
6775 {
6776 data << uint32(0);
6777 data << float(0);
6778 data << float(0);
6779 data << float(0);
6780 data << float(0);
6781 data << float(0);
6782 data << float(0);
6783 data << float(0);
6784 data << float(0);
6785 data << float(0); // Found in a loop with 1 iteration
6786 data << float(0); // ditto ^
6787 data << uint32(0);
6788 }
6789
6790 SendMessageToSet(&data, true);
6791}
@ HITINFO_RAGE_GAIN
Definition Unit.h:122
@ HITINFO_UNK1
Definition Unit.h:99
@ SMSG_ATTACKERSTATEUPDATE
Definition Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6794{
6795 CalcDamageInfo dmgInfo;
6796 dmgInfo.HitInfo = HitInfo;
6797 dmgInfo.attacker = this;
6798 dmgInfo.target = target;
6799
6800 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6801 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6802 dmgInfo.damages[0].absorb = AbsorbDamage;
6803 dmgInfo.damages[0].resist = Resist;
6804
6805 dmgInfo.damages[1].damage = 0;
6806 dmgInfo.damages[1].damageSchoolMask = 0;
6807 dmgInfo.damages[1].absorb = 0;
6808 dmgInfo.damages[1].resist = 0;
6809
6810 dmgInfo.TargetState = TargetState;
6811 dmgInfo.blocked_amount = BlockedAmount;
6812 SendAttackStateUpdate(&dmgInfo);
6813}
HitInfo
Definition Unit.h:97

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
20074{
20075 if (!GetThreatMgr().isThreatListEmpty())
20076 {
20077 uint32 count = GetThreatMgr().GetThreatList().size();
20078
20079 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
20080 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
20081 data << GetPackGUID();
20082 data << pHostileReference->getUnitGuid().WriteAsPacked();
20083 data << uint32(count);
20085 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20086 {
20087 data << (*itr)->getUnitGuid().WriteAsPacked();
20088 data << uint32((*itr)->GetThreat() * 100);
20089 }
20090 SendMessageToSet(&data, false);
20091 }
20092}
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
std::list< HostileReference * > StorageType
Definition ThreatMgr.h:147
@ SMSG_HIGHEST_THREAT_UPDATE
Definition Opcodes.h:1184

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20302{
20304 data << GetPackGUID();
20305 SendMessageToSet(&data, false);
20306}
@ SMSG_BREAK_TARGET
Definition Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
20095{
20096 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
20098 data << GetPackGUID();
20099 SendMessageToSet(&data, false);
20100}
@ SMSG_THREAT_CLEAR
Definition Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
17114{
17115 if (m_cleanupDone)
17116 {
17117 return;
17118 }
17119
17121 if (Player* playerMe = ToPlayer())
17122 {
17123 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
17124 data << packGUID;
17125 data << uint8(m_comboPoints);
17126 playerMe->SendDirectMessage(&data);
17127 }
17128
17129 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
17130 Player* owner = nullptr;
17131 if (ownerGuid.IsPlayer())
17132 {
17133 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
17134 }
17135
17136 if (m_movedByPlayer || owner)
17137 {
17138 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
17139 data << GetPackGUID();
17140 data << packGUID;
17141 data << uint8(m_comboPoints);
17142
17143 if (m_movedByPlayer)
17145
17146 if (owner && owner != m_movedByPlayer)
17147 owner->SendDirectMessage(&data);
17148 }
17149}
Definition ObjectGuid.h:263
std::size_t size() const
Definition ObjectGuid.h:274
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition Opcodes.h:955

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11466{
11467 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11468 data << victim->GetPackGUID();
11469 data << GetPackGUID();
11470 data << uint32(spellID);
11471 data << uint32(powerType);
11472 data << uint32(damage);
11473 SendMessageToSet(&data, true);
11474}
@ SMSG_SPELLENERGIZELOG
Definition Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11433{
11434 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11435
11436 // we guess size
11437 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11438 data << healInfo.GetTarget()->GetPackGUID();
11439 data << GetPackGUID();
11440 data << uint32(healInfo.GetSpellInfo()->Id);
11441 data << uint32(healInfo.GetHeal());
11442 data << uint32(overheal);
11443 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11444 data << uint8(critical ? 1 : 0);
11445 data << uint8(0); // unused
11446 SendMessageToSet(&data, true);
11447}
@ SMSG_SPELLHEALLOG
Definition Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3100{
3101 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3102 data << GetGUID();
3103 data << victim->GetGUID();
3104 if (sendTo)
3105 sendTo->SendDirectMessage(&data);
3106 else
3107 SendMessageToSet(&data, true);
3108 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3109}
@ SMSG_ATTACKSTART
Definition Opcodes.h:353

References Object::GetGUID(), Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)

Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.

3116{
3117 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3118 // pussywizard: this happens in some boss scripts, just add clearing here
3119 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3120
3121 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3122 data << GetPackGUID();
3123
3124 if (victim)
3125 {
3126 data << victim->GetPackGUID();
3127 data << (uint32)victim->isDead();
3128 }
3129 SendMessageToSet(&data, true);
3130 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3131
3132 if (victim)
3133 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3134 else
3135 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3136}
bool isDead() const
Definition Unit.h:1775
@ SMSG_ATTACKSTOP
Definition Opcodes.h:354

References Object::GetGUID(), Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, and ObjectGuid::ToString().

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), and boss_razorscale::boss_razorscaleAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
539{
540 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
541 data << GetPackGUID();
542
543 data << uint8(0); // new in 3.1
544 data << GetPositionX() << GetPositionY() << GetPositionZ();
545 data << GameTime::GetGameTimeMS().count();
546 data << uint8(0);
547 data << uint32(sf);
548 data << TransitTime; // Time in between points
549 data << uint32(1); // 1 single waypoint
550 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
551
552 SendMessageToSet(&data, true);
553}
@ SMSG_MONSTER_MOVE
Definition Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
20782{
20783 if (!movespline->Initialized())
20784 return;
20786 data << GetPackGUID();
20787 sendTo->SendDirectMessage(&data);
20788}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16921{
16922 if (IsRooted())
16923 {
16924 // each case where this occurs has to be examined and reported and dealt with.
16925 LOG_ERROR("Unit", "Attempted sending heartbeat with root flag for guid {}", GetGUID().ToString());
16926 return;
16927 }
16928
16929 WorldPacket data;
16930 BuildHeartBeatMsg(&data);
16931 SendMessageToSet(&data, self);
16932}
bool IsRooted() const
Definition Unit.h:1695
void BuildHeartBeatMsg(WorldPacket *data) const
Definition Object.cpp:2076

References BuildHeartBeatMsg(), Object::GetGUID(), IsRooted(), LOG_ERROR, WorldObject::SendMessageToSet(), and Position::ToString().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_madrigosa::DoAction(), boss_nightbane::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_felmyst::InitializeAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_volkhan::MovementInform(), boss_felmyst::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), SetCharm(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), and brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20791{
20792 if (!movespline->Initialized())
20793 return;
20795 data << GetPackGUID();
20796 sendTo->SendDirectMessage(&data);
20797}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20773{
20774 if (!movespline->Initialized())
20775 return;
20777 data << GetPackGUID();
20778 sendTo->SendDirectMessage(&data);
20779}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

◆ SendMoveRoot()

void Unit::SendMoveRoot ( bool  state)
protected
18481{
18482 const Player* client = GetClientControlling();
18483
18484 // Apply flags in-place when unit currently is not controlled by a player
18485 if (!client)
18486 {
18487 if (apply)
18488 {
18491 if (!client)
18492 StopMoving();
18493 }
18494 else
18496 }
18497
18498 if (!IsInWorld())
18499 return;
18500
18501 const PackedGuid& guid = GetPackGUID();
18502 // Wrath+ spline root: when unit is currently not controlled by a player
18503 if (!client)
18504 {
18505 WorldPacket data(apply ? SMSG_SPLINE_MOVE_ROOT : SMSG_SPLINE_MOVE_UNROOT, guid.size());
18506 data << guid;
18507 SendMessageToSet(&data, true);
18508 }
18509 // Wrath+ force root: when unit is controlled by a player
18510 else
18511 {
18512 uint32 const counter = client->GetSession()->GetOrderCounter();
18513
18514 WorldPacket data(apply ? SMSG_FORCE_MOVE_ROOT : SMSG_FORCE_MOVE_UNROOT, guid.size() + 4);
18515 data << guid;
18516 data << counter;
18517 client->GetSession()->SendPacket(&data);
18518 client->GetSession()->IncrementOrderCounter();
18519 }
18520}
@ MOVEMENTFLAG_MASK_MOVING_FLY
Definition UnitDefines.h:410
Player const * GetClientControlling() const
Definition Unit.cpp:21466
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:252
@ SMSG_FORCE_MOVE_UNROOT
Definition Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition Opcodes.h:262
@ SMSG_SPLINE_MOVE_UNROOT
Definition Opcodes.h:802
@ SMSG_SPLINE_MOVE_ROOT
Definition Opcodes.h:824
void AddMovementFlag(uint32 flag)
Definition Object.h:343

References MovementInfo::AddMovementFlag(), GetClientControlling(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), Player::GetSession(), WorldSession::IncrementOrderCounter(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_MASK_MOVING_FLY, MOVEMENTFLAG_ROOT, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), WorldSession::SendPacket(), PackedGuid::size(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, and StopMoving().

Referenced by Player::BuildPlayerRepop(), Player::KillPlayer(), Player::ResurrectPlayer(), and SetRooted().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6617{
6618 AuraEffect const* aura = pInfo->auraEff;
6620 data << GetPackGUID();
6621 data << aura->GetCasterGUID().WriteAsPacked();
6622 data << uint32(aura->GetId()); // spellId
6623 data << uint32(1); // count
6624 data << uint32(aura->GetAuraType()); // auraId
6625 switch (aura->GetAuraType())
6626 {
6629 {
6630 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6631 uint32 damage = pInfo->damage;
6632 uint32 absorb = pInfo->absorb;
6633 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6634 {
6635 absorb = damage;
6636 damage = 0;
6637 }
6638
6639 data << uint32(damage); // damage
6640 data << uint32(pInfo->overDamage); // overkill?
6641 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6642 data << uint32(absorb); // absorb
6643 data << uint32(pInfo->resist); // resist
6644 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6645 }
6646 break;
6649 data << uint32(pInfo->damage); // damage
6650 data << uint32(pInfo->overDamage); // overheal
6651 data << uint32(pInfo->absorb); // absorb
6652 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6653 break;
6656 data << uint32(aura->GetMiscValue()); // power type
6657 data << uint32(pInfo->damage); // damage
6658 break;
6660 data << uint32(aura->GetMiscValue()); // power type
6661 data << uint32(pInfo->damage); // amount
6662 data << float(pInfo->multiplier); // gain multiplier
6663 break;
6664 default:
6665 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6666 return;
6667 }
6668
6669 SendMessageToSet(&data, true);
6670}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition Opcodes.h:620
float multiplier
Definition Unit.h:528
bool critical
Definition Unit.h:529
uint32 overDamage
Definition Unit.h:525
uint32 resist
Definition Unit.h:527
uint32 damage
Definition Unit.h:524
AuraEffect const * auraEff
Definition Unit.h:523
uint32 absorb
Definition Unit.h:526

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::IsPlayer(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg) const

-------—Pet responses methods--------------—

16826{
16827 Unit* owner = GetOwner();
16828 if (!owner || !owner->IsPlayer())
16829 return;
16830
16832 data << uint8(msg);
16833 owner->ToPlayer()->SendDirectMessage(&data);
16834}
@ SMSG_PET_ACTION_FEEDBACK
Definition Opcodes.h:740

References GetOwner(), Object::IsPlayer(), Player::SendDirectMessage(), SMSG_PET_ACTION_FEEDBACK, and Object::ToPlayer().

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetActionSound()

void Unit::SendPetActionSound ( PetAction  action) const
16837{
16838 SendMessageToSet(WorldPackets::Pet::PetActionSound(GetGUID(), static_cast<int32>(action)).Write(), false);
16839}
Definition PetPackets.h:100

References Object::GetGUID(), and WorldObject::SendMessageToSet().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid) const
16848{
16849 Unit* owner = GetOwner();
16850 if (!owner || !owner->IsPlayer())
16851 return;
16852
16853 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16854 data << guid;
16855 data << uint32(AI_REACTION_HOSTILE);
16856 owner->ToPlayer()->SendDirectMessage(&data);
16857}
@ SMSG_AI_REACTION
Definition Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Object::IsPlayer(), Player::SendDirectMessage(), SMSG_AI_REACTION, and Object::ToPlayer().

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetDismissSound()

void Unit::SendPetDismissSound ( ) const
16842{
16843 if (CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId()))
16844 SendMessageToSet(WorldPackets::Pet::PetDismissSound(static_cast<int32>(displayInfo->ModelId), GetPosition()).Write(), false);
16845}
Definition PetPackets.h:112
Position GetPosition() const
Definition Position.h:147

References GetNativeDisplayId(), Position::GetPosition(), sCreatureDisplayInfoStore, and WorldObject::SendMessageToSet().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
19167{
19169 data << guid; // target
19170 data << uint32(id); // SpellVisualKit.dbc index
19171 SendMessageToSet(&data, true);
19172}
@ SMSG_PLAY_SPELL_IMPACT
Definition Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand(), and WorldSession::HandleTrainerBuySpellOpcode().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
20103{
20104 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
20105 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
20106 data << GetPackGUID();
20107 data << pHostileReference->getUnitGuid().WriteAsPacked();
20108 SendMessageToSet(&data, false);
20109}
@ SMSG_THREAT_REMOVE
Definition Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6697{
6698 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6699 data << GetGUID();
6700 data << target->GetGUID();
6701 data << uint32(spellId);
6702 data << uint8(0); // bool - log format: 0-default, 1-debug
6703 SendMessageToSet(&data, true);
6704}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition Opcodes.h:641

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealDamageShieldDamage(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6687{
6688 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6689 data << GetGUID();
6690 data << target->GetGUID();
6691 data << uint32(spellId);
6692 data << uint8(0); // bool - log format: 0-default, 1-debug
6693 SendMessageToSet(&data, true);
6694}
@ SMSG_PROCRESIST
Definition Opcodes.h:638

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6673{
6674 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6675 data << uint32(spellID);
6676 data << GetGUID();
6677 data << uint8(0); // can be 0 or 1
6678 data << uint32(1); // target count
6679 // for (i = 0; i < target count; ++i)
6680 data << target->GetGUID(); // target GUID
6681 data << uint8(missInfo);
6682 // end loop
6683 SendMessageToSet(&data, true);
6684}
@ SMSG_SPELLLOGMISS
Definition Opcodes.h:617

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealDamageShieldDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6538{
6539 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6540 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6541 uint32 damage = log->damage;
6542 uint32 absorb = log->absorb;
6543 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6544 {
6545 absorb = damage;
6546 damage = 0;
6547 }
6548 data << log->target->GetPackGUID();
6549 data << log->attacker->GetPackGUID();
6550 data << uint32(log->spellInfo->Id);
6551 data << uint32(damage); // damage amount
6552 int32 overkill = damage - log->target->GetHealth();
6553 data << uint32(overkill > 0 ? overkill : 0); // overkill
6554 data << uint8 (log->schoolMask); // damage school
6555 data << uint32(absorb); // AbsorbedDamage
6556 data << uint32(log->resist); // resist
6557 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6558 data << uint8 (log->unused); // unused
6559 data << uint32(log->blocked); // blocked
6560 data << uint32(log->HitInfo);
6561 data << uint32(log->HitInfo);
6563 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6564 //{
6565 // data << float(log->CritRoll);
6566 // data << float(log->CritNeeded);
6567 //}
6568 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6569 //{
6570 // data << float(log->HitRoll);
6571 // data << float(log->HitNeeded);
6572 //}
6573 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6574 //{
6575 // data << float(log->MissChance);
6576 // data << float(log->DodgeChance);
6577 // data << float(log->ParryChance);
6578 // data << float(log->BlockChance);
6579 // data << float(log->GlanceChance);
6580 // data << float(log->CrushChance);
6581 //}
6582 SendMessageToSet(&data, true);
6583}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition SharedDefines.h:1548
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition SharedDefines.h:1551
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition SharedDefines.h:1546
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition Opcodes.h:622
bool physicalLog
Definition Unit.h:510
bool unused
Definition Unit.h:511

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6586{
6587 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6588 log.damage = Damage;
6589 log.absorb = AbsorbedDamage;
6590 log.resist = Resist;
6591 log.physicalLog = PhysicalDamage;
6592 log.blocked = Blocked;
6593 log.HitInfo = 0;
6594 if (CriticalHit)
6595 {
6596 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6597 }
6598 if (Split)
6599 {
6600 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6601 }
6603}
@ SPELL_HIT_TYPE_SPLIT
Definition SharedDefines.h:1549
Definition Unit.h:496

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6506{
6507 // Xinef: function for players only, placed in unit because of cosmetics
6508 if (!IsPlayer())
6509 return;
6510
6511 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6512 // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop
6513 uint32 damage = log->damage;
6514 uint32 absorb = log->absorb;
6515 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6516 {
6517 absorb = damage;
6518 damage = 0;
6519 }
6520 data << log->target->GetPackGUID();
6521 data << attacker->GetPackGUID();
6522 data << uint32(log->spellInfo->Id);
6523 data << uint32(damage); // damage amount
6524 int32 overkill = damage - log->target->GetHealth();
6525 data << uint32(overkill > 0 ? overkill : 0); // overkill
6526 data << uint8 (log->schoolMask); // damage school
6527 data << uint32(absorb); // AbsorbedDamage
6528 data << uint32(log->resist); // resist
6529 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6530 data << uint8 (log->unused); // unused
6531 data << uint32(log->blocked); // blocked
6532 data << uint32(log->HitInfo);
6533 data << uint8 (0); // flag to use extend data
6534 ToPlayer()->SendDirectMessage(&data);
6535}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
19975{
19977 data << uint8(result);
19978 ToPlayer()->SendDirectMessage(&data);
19979}
@ SMSG_PET_TAME_FAILURE
Definition Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)
19982{
19984 if (IsCreature())
19985 Relocate(&pos);
19986 if (IsPlayer())
19987 {
19988 ToPlayer()->SetCanTeleport(true);
19989 }
19990 WorldPacket data2(MSG_MOVE_TELEPORT, 38);
19991 data2 << GetPackGUID();
19992 BuildMovementPacket(&data2);
19993 if (IsCreature())
19994 Relocate(&oldPos);
19995 if (IsPlayer())
19996 Relocate(&pos);
19997 SendMessageToSet(&data2, false);
19998}
@ MSG_MOVE_TELEPORT
Definition Opcodes.h:227

References BuildMovementPacket(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsCreature(), Object::IsPlayer(), MSG_MOVE_TELEPORT, Position::Relocate(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), and Object::ToPlayer().

Referenced by NearTeleportTo(), and Player::TeleportTo().

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
20054{
20055 if (!GetThreatMgr().isThreatListEmpty())
20056 {
20057 uint32 count = GetThreatMgr().GetThreatList().size();
20058
20059 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
20060 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
20061 data << GetPackGUID();
20062 data << uint32(count);
20064 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20065 {
20066 data << (*itr)->getUnitGuid().WriteAsPacked();
20067 data << uint32((*itr)->GetThreat() * 100);
20068 }
20069 SendMessageToSet(&data, false);
20070 }
20071}
@ SMSG_THREAT_UPDATE
Definition Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
684{ i_AI = newAI; }

References i_AI.

◆ SetAnimTier()

void Unit::SetAnimTier ( AnimTier  animTier)

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
19150{
19151 Aura* aura = target->GetAura(spellId, GetGUID());
19152 if (!aura)
19153 aura = AddAura(spellId, target);
19154 if (aura && stack)
19155 aura->SetStackAmount(stack);
19156}
void SetStackAmount(uint8 num)
Definition SpellAuras.cpp:937

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
1196{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

void Unit::SetCanFly ( bool  enable)

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

20608{
20609 bool isClientControlled = IsClientControlled();
20610
20611 if (!isClientControlled)
20612 {
20613 if (enable)
20615 else
20617 }
20618
20619 if (!IsInWorld()) // is sent on add to map
20620 return;
20621
20622 if (isClientControlled)
20623 {
20624 if (Player const* player = GetClientControlling())
20625 {
20626 uint32 const counter = player->GetSession()->GetOrderCounter();
20627 const_cast<Player*>(player)->SetPendingFlightChange(counter);
20628
20630 data << GetPackGUID();
20631 data << counter;
20632 player->SendDirectMessage(&data);
20633 player->GetSession()->IncrementOrderCounter();
20634 return;
20635 }
20636 }
20637
20639 data << GetPackGUID();
20640 SendMessageToSet(&data, true);
20641}
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:393
@ SMSG_SPLINE_MOVE_SET_FLYING
Definition Opcodes.h:1088
@ SMSG_MOVE_SET_CAN_FLY
Definition Opcodes.h:865
@ SMSG_SPLINE_MOVE_UNSET_FLYING
Definition Opcodes.h:1089
@ SMSG_MOVE_UNSET_CAN_FLY
Definition Opcodes.h:866

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_CAN_FLY, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_SET_CAN_FLY, SMSG_MOVE_UNSET_CAN_FLY, SMSG_SPLINE_MOVE_SET_FLYING, and SMSG_SPLINE_MOVE_UNSET_FLYING.

Referenced by boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_kalecgos_kj::DoAction(), boss_nightbane::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), gm_commandscript::HandleGMFlyCommand(), WorldSession::HandleMoveKnockBackAck(), boss_felmyst::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_urom::boss_uromAI::JustDied(), boss_sartharion_dragonAI::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), npc_icc_spire_frostwyrm::JustReachedHome(), brann_bronzebeard::brann_bronzebeardAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_kiljaeden::JustSummoned(), boss_onyxia::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_spire_frostwyrm::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_pet_dk_ebon_gargoyle::MovementInform(), npc_alexstrasza::npc_alexstraszaAI::npc_alexstraszaAI(), npc_batrider::npc_batrider(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_pet_gen_moth::npc_pet_gen_moth(), spell_chapter5_light_of_dawn_aura::OnApply(), spell_chapter5_light_of_dawn_aura::OnRemove(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), npc_hallows_end_soh::Reset(), boss_onyxia::Reset(), boss_ayamiss::Reset(), boss_sartharion_dragonAI::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_icc_spire_frostwyrm::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), boss_nazan::Reset(), boss_felmyst::ScheduleGroundAbilities(), SmartAI::SetFly(), npc_simon_bunny::npc_simon_bunnyAI::SetGUID(), boss_urom::boss_uromAI::SpellHit(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_batrider::UpdateAI(), and Creature::UpdateMovementFlags().

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
17531{
17532 if (apply)
17533 ++m_procDeep;
17534 else
17535 {
17537 --m_procDeep;
17538 }
17539}

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
11081{
11082 if (apply)
11083 {
11084 if (IsPlayer())
11085 {
11086 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
11087 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
11088
11089 charm->m_ControlledByPlayer = true;
11091 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11092 }
11093 else
11094 {
11095 charm->m_ControlledByPlayer = false;
11097 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11098 }
11099
11100 // PvP, FFAPvP
11101 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
11102
11103 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
11104 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
11105
11106 _isWalkingBeforeCharm = charm->IsWalking();
11108 {
11109 charm->SetWalk(false);
11110 charm->SendMovementFlagUpdate();
11111 }
11112
11113 m_Controlled.insert(charm);
11114 }
11115 else
11116 {
11117 if (IsPlayer())
11118 {
11119 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
11120 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
11121 }
11122
11123 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
11124 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
11125
11126 if (charm->IsPlayer())
11127 {
11128 charm->m_ControlledByPlayer = true;
11129 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11130 charm->ToPlayer()->UpdatePvPState();
11131 }
11132 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
11133 {
11134 charm->m_ControlledByPlayer = true;
11135 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11136 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
11137
11138 // Xinef: skip controlled erase if charmed unit is owned by charmer
11139 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
11140 return;
11141 }
11142 else
11143 {
11144 charm->m_ControlledByPlayer = false;
11145 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11146 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
11147 }
11148
11149 if (charm->IsWalking() != _isWalkingBeforeCharm)
11150 {
11151 charm->SetWalk(_isWalkingBeforeCharm);
11152 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
11153 }
11154
11155 m_Controlled.erase(charm);
11156 }
11157}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:675
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:693

References _isWalkingBeforeCharm, Object::AddGuidValue(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetName(), HasUnitFlag(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18598{
18599 if (!charmer)
18600 return false;
18601
18602 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18603 {
18604 return false;
18605 }
18606
18607 // dismount players when charmed
18608 if (IsPlayer() && type != CHARM_TYPE_POSSESS)
18610
18611 if (charmer->IsPlayer())
18613
18614 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18615 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18616 throw 1;
18617 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18618
18619 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18620 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18621
18622 if (this == charmer)
18623 {
18624 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18625 return false;
18626 }
18627
18628 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18629 // return false;
18630
18631 if (IsPlayer() && ToPlayer()->GetTransport())
18632 {
18633 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18634 return false;
18635 }
18636
18637 // Already charmed
18638 if (GetCharmerGUID())
18639 {
18640 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18641 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18642 return false;
18643 }
18644
18645 CastStop();
18646 AttackStop();
18647
18648 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18649 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18650 // DeleteThreatList();
18651
18652 Player* playerCharmer = charmer->ToPlayer();
18653
18654 // Charmer stop charming
18655 if (playerCharmer)
18656 {
18657 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18658 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18659 }
18660
18661 // Charmed stop charming
18662 if (IsPlayer())
18663 {
18664 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18665 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18666 }
18667
18668 // StopCastingCharm may remove a possessed pet?
18669 if (!IsInWorld())
18670 {
18671 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18672 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18673 return false;
18674 }
18675
18676 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18677 // prevent undefined behaviour
18678 if (aurApp && aurApp->GetRemoveMode())
18679 return false;
18680
18682 SetFaction(charmer->GetFaction());
18683
18684 // Set charmed
18685 charmer->SetCharm(this, true);
18686
18688
18689 if (IsCreature())
18690 {
18691 GetMotionMaster()->Clear(false);
18693 StopMoving();
18694
18695 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18696 {
18697 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18698 Creature* charmed = ToCreature();
18699 charmed->NeedChangeAI = true;
18700 charmed->IsAIEnabled = false;
18701 }
18702 else
18703 {
18704 ToCreature()->AI()->OnCharmed(true);
18705 }
18706
18707 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18708 if (charmer->IsPlayer() && ToCreature()->CanFly())
18710 }
18711 else
18712 {
18713 Player* player = ToPlayer();
18714 if (player->isAFK())
18715 player->ToggleAFK();
18716
18717 player->SetClientControl(this, false); // verified
18718 }
18719
18720 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18721 // prevent undefined behaviour
18722 if (aurApp && aurApp->GetRemoveMode())
18723 return false;
18724
18725 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18726 // Xinef: I need charmInfo for vehicle
18727 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18728 {
18729 InitCharmInfo();
18730 if (type == CHARM_TYPE_POSSESS)
18732 else if (type != CHARM_TYPE_VEHICLE)
18733 {
18735
18736 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18737 if (type == CHARM_TYPE_CONVERT && IsCreature())
18739 }
18740 }
18741
18742 if (playerCharmer)
18743 {
18744 switch (type)
18745 {
18746 case CHARM_TYPE_VEHICLE:
18749 playerCharmer->SetClientControl(this, true); // verified
18750 playerCharmer->VehicleSpellInitialize();
18751 break;
18752 case CHARM_TYPE_POSSESS:
18757 playerCharmer->SetClientControl(this, true); // verified
18758 playerCharmer->PossessSpellInitialize();
18759 break;
18760 case CHARM_TYPE_CHARM:
18762 {
18764 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18765 {
18766 // to prevent client crash
18768
18769 // just to enable stat window
18770 if (GetCharmInfo())
18771 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18772
18773 // if charmed two demons the same session, the 2nd gets the 1st one's name
18774 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18775 }
18776 }
18777 if (playerCharmer->m_seer != this)
18778 {
18780 playerCharmer->CharmSpellInitialize();
18781 }
18782 break;
18783 default:
18784 break;
18785 }
18786 }
18787 else if (IsPlayer())
18789
18790 if (Creature* creature = ToCreature())
18791 creature->RefreshSwimmingFlag();
18792
18793 if (IsPlayer())
18794 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18795
18796 return true;
18797}
@ CHARM_TYPE_CONVERT
Definition CharmInfo.h:48
@ REACT_DEFENSIVE
Definition Unit.h:556
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition UpdateFields.h:133
void OnCharmed(bool apply) override
Called when unit is charmed.
Definition CreatureAI.cpp:36
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition Creature.h:99
void MoveIdle()
Definition MotionMaster.cpp:233
void CharmSpellInitialize()
Definition Player.cpp:9731
WorldObject * m_seer
Definition Player.h:2348
void ToggleAFK()
Definition Player.cpp:1310
void PossessSpellInitialize()
Definition Player.cpp:9628
bool isAFK() const
Definition Player.h:1136
void VehicleSpellInitialize()
Definition Player.cpp:9656
void StopCastingBindSight(Aura *except=nullptr)
Definition Player.cpp:13198
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:762
virtual float GetFollowAngle() const
Definition Unit.h:1875
CharmInfo * InitCharmInfo()
Definition Unit.cpp:16032
void InitPossessCreateSpells()
Definition CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition CharmInfo.cpp:98

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), Object::IsCreature(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
935{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18566{
18567 if (apply)
18568 {
18569 SetTarget();
18571 }
18572 else
18573 {
18574 if (IsAlive())
18575 {
18576 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18577 {
18579 StopMoving();
18580 }
18581
18582 if (GetVictim())
18584 }
18585 }
18586
18587 // xinef: block / allow control to real mover (eg. charmer)
18588 if (IsPlayer())
18589 {
18590 if (m_movedByPlayer)
18591 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18592 //else
18593 // ToPlayer()->SetClientControl(this, !apply);
18594 }
18595}
@ CONFUSED_MOTION_TYPE
Definition MotionMaster.h:44
void MoveConfused()
Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:293

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17493{
17495
17496 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17497 return;
17498
17499 // check if there any guards that should care about the contested flag on player
17500 if (lookForNearContestedGuards)
17501 {
17502 std::list<Unit*> targets;
17505 Cell::VisitObjects(this, searcher, MAX_AGGRO_RADIUS);
17506
17507 // return if there are no contested guards found
17508 if (!targets.size())
17509 {
17510 return;
17511 }
17512 }
17513
17514 player->SetContestedPvPTimer(30000);
17516 {
17519 // call MoveInLineOfSight for nearby contested guards
17521 }
17523 {
17525 // call MoveInLineOfSight for nearby contested guards
17527 }
17528}
#define MAX_AGGRO_RADIUS
Definition Unit.h:45
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1111
bool InBattleground() const
Definition Player.h:2266
void SetContestedPvPTimer(uint32 newTime)
Definition Player.h:1864

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
18293{
18294 if (apply)
18295 {
18296 if (HasUnitState(state))
18297 return;
18298
18299 AddUnitState(state);
18300 switch (state)
18301 {
18302 case UNIT_STATE_STUNNED:
18303 SetStunned(true);
18304 break;
18305 case UNIT_STATE_ROOT:
18307 SetRooted(true);
18308 break;
18311 {
18314 // SendAutoRepeatCancel ?
18315 SetConfused(true);
18316 CastStop(0, false);
18317 }
18318 break;
18319 case UNIT_STATE_FLEEING:
18321 {
18324 // SendAutoRepeatCancel ?
18325 SetFeared(true, source, isFear);
18326 CastStop(0, false);
18327 }
18328 break;
18329 default:
18330 break;
18331 }
18332
18333 if (IsPlayer())
18334 {
18335 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18336 }
18337 }
18338 else
18339 {
18340 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18341 // xinef: added to each case because of return
18342 //ClearUnitState(state);
18343
18344 switch (state)
18345 {
18346 case UNIT_STATE_STUNNED:
18347 if (HasStunAura())
18348 return;
18349 ClearUnitState(state);
18350 SetStunned(false);
18351 break;
18352 case UNIT_STATE_ROOT:
18353 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18354 if (IsCreature())
18355 {
18356 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18357 {
18358 return;
18359 }
18360 }
18361
18362 if (HasRootAura() || GetVehicle())
18363 return;
18364 ClearUnitState(state);
18365 SetRooted(false);
18366 break;
18368 if (HasConfuseAura())
18369 return;
18370 ClearUnitState(state);
18371 SetConfused(false);
18372 break;
18373 case UNIT_STATE_FLEEING:
18374 if (HasFearAura())
18375 return;
18376 ClearUnitState(state);
18377 SetFeared(false);
18378 break;
18379 default:
18380 return;
18381 }
18382
18383 //ClearUnitState(state);
18384
18386 SetStunned(true);
18387 else
18388 {
18390 SetRooted(true);
18391
18393 SetConfused(true);
18395 {
18396 bool isFear = false;
18397 if (HasFearAura())
18398 {
18399 isFear = true;
18400 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18401 }
18402
18403 if (!source)
18404 {
18405 source = getAttackerForHelper();
18406 }
18407
18408 SetFeared(true, source, isFear);
18409 }
18410 }
18411 }
18412}
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition Unit.cpp:18533
bool HasStunAura() const
Definition Unit.h:1819
void SetConfused(bool apply)
Definition Unit.cpp:18565
void SetStunned(bool apply)
Definition Unit.cpp:18414
Unit * getAttackerForHelper() const
Definition Unit.cpp:754
bool HasConfuseAura() const
Definition Unit.h:1817
void SetRooted(bool apply, bool stun=false, bool logout=false)
Definition Unit.cpp:18460
bool HasRootAura() const
Definition Unit.h:1818
bool HasFearAura() const
Definition Unit.h:1816
Definition Unit.h:264

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), ObjectAccessor::GetUnit(), GetVehicle(), HasConfuseAura(), HasFearAura(), HasRootAura(), HasStunAura(), HasUnitState(), Object::IsCreature(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_FEAR, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayal(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), npc_akama_illidan::PathEndReached(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::npc_twilight_summonAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), boss_illidan_stormrage::ScheduleAbilities(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
4002{
4003 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
4004
4005 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
4006
4007 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
4008 return;
4009
4010 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
4011
4012 // break same type spell if it is not delayed
4013 InterruptSpell(CSpellType, false, true, bySelf);
4014
4015 // special breakage effects:
4016 switch (CSpellType)
4017 {
4019 {
4020 // generic spells always break channeled not delayed spells
4022 {
4023 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4024 {
4026 }
4027 }
4028
4029 // autorepeat breaking
4031 {
4032 // break autorepeat if not Auto Shot
4033 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4035 m_AutoRepeatFirstCast = true;
4036 }
4037
4038 // melee spells breaking
4040 {
4041 // break melee spells if cast time
4042 if (pSpell->GetCastTime() > 0)
4043 {
4045 }
4046 }
4047 if (pSpell->GetCastTime() > 0)
4049
4050 break;
4051 }
4053 {
4054 // channel spells always break generic non-delayed and any channeled spells
4056 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4057
4058 // it also does break autorepeat if not Auto Shot
4060 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4063
4064 break;
4065 }
4067 {
4068 // only Auto Shoot does not break anything
4069 if (pSpell->m_spellInfo->Id != 75)
4070 {
4071 // generic autorepeats break generic non-delayed and channeled non-delayed spells
4073 {
4074 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4075 {
4077 }
4078 }
4079
4081 }
4082 // special action: set first cast flag
4083 m_AutoRepeatFirstCast = true;
4084
4085 break;
4086 }
4087
4088 default:
4089 // other spell types don't break anything now
4090 break;
4091 }
4092
4093 // current spell (if it is still here) may be safely deleted now
4094 if (m_currentSpells[CSpellType])
4095 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4096
4097 // set new current spell
4098 m_currentSpells[CSpellType] = pSpell;
4099 pSpell->SetReferencedFromCurrent(true);
4100
4101 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4102}
CurrentSpellTypes GetCurrentContainer() const
Definition Spell.cpp:7905
Spell ** m_selfContainer
Definition Spell.h:622

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14659{
14660 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14661 // it can be used to check creation of death items (such as soul shards).
14662 m_deathState = s;
14663
14665 {
14666 CombatStop();
14669 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14670
14671 if (IsNonMeleeSpellCast(false))
14673
14674 UnsummonAllTotems(true);
14675 RemoveAllControlled(true);
14677 }
14678
14679 if (s == DeathState::JustDied)
14680 {
14681 // remove aurastates allowing special moves
14684
14685 GetMotionMaster()->Clear(false);
14687
14688 // Xinef: Remove Hover so the corpse can fall to the ground
14689 SetHover(false);
14690
14691 if (despawn)
14692 DisableSpline();
14693 else
14694 StopMoving();
14695
14696 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14697 // do not why since in IncreaseMaxHealth currenthealth is checked
14698 SetHealth(0);
14699 SetPower(getPowerType(), 0);
14700
14701 // Stop emote on death
14703
14704 // players in instance don't have ZoneScript, but they have InstanceScript
14706 zoneScript->OnUnitDeath(this);
14707 }
14708 else if (s == DeathState::JustRespawned)
14709 {
14710 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14711 }
14712}
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:280
void SetHover(bool enable)
Definition Unit.cpp:20684
void ClearAllReactives()
Definition Unit.cpp:17159
void ClearDiminishings()
Definition Unit.h:1842
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1214
ZoneScript * GetZoneScript() const
Definition Object.h:626
Definition ZoneScript.h:26

References Alive, MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), JustDied, JustRespawned, m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

void Unit::SetDisableGravity ( bool  disable)
20548{
20549 bool isClientControlled = IsClientControlled();
20550
20551 if (!isClientControlled)
20552 {
20553 if (enable)
20555 else
20557 }
20558
20559 if (!IsInWorld()) // is sent on add to map
20560 return;
20561
20562 if (isClientControlled)
20563 {
20564 if (Player const* player = GetClientControlling())
20565 {
20566 uint32 const counter = player->GetSession()->GetOrderCounter();
20567
20569 data << GetPackGUID();
20570 data << counter;
20571 player->GetSession()->SendPacket(&data);
20572 player->GetSession()->IncrementOrderCounter();
20573 return;
20574 }
20575 }
20576
20578 data << GetPackGUID();
20579 SendMessageToSet(&data, true);
20580}
@ SMSG_SPLINE_MOVE_GRAVITY_DISABLE
Definition Opcodes.h:1265
@ SMSG_MOVE_GRAVITY_DISABLE
Definition Opcodes.h:1260
@ SMSG_MOVE_GRAVITY_ENABLE
Definition Opcodes.h:1262
@ SMSG_SPLINE_MOVE_GRAVITY_ENABLE
Definition Opcodes.h:1266

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_DISABLE_GRAVITY, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_GRAVITY_DISABLE, SMSG_MOVE_GRAVITY_ENABLE, SMSG_SPLINE_MOVE_GRAVITY_DISABLE, and SMSG_SPLINE_MOVE_GRAVITY_ENABLE.

Referenced by boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::boss_yoggsaron_brainAI(), boss_the_lurker_below::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_nightbane::DoAction(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_taldaram::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_madrigosa::DoAction(), boss_kalecgos::DoAction(), npc_kalecgos_kj::DoAction(), boss_illidan_stormrage::DoAction(), boss_nightbane::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_the_lich_king_valkyr_target_search::HandleScript(), boss_felmyst::InitializeAI(), boss_taldaram::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), boss_malygos::boss_malygosAI::InitializeAI(), boss_razorscale::boss_razorscaleAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_kologarn::boss_kologarnAI::JustDied(), boss_ayamiss::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_saviana_ragefire::boss_saviana_ragefireAI::JustReachedHome(), npc_spinestalker::npc_spinestalkerAI::JustReachedHome(), npc_rimefang::npc_rimefangAI::JustReachedHome(), npc_icc_spire_frostwyrm::JustReachedHome(), boss_ingvar_the_plunderer::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_enslaved_netherwing_drake::MovementInform(), boss_onyxia::MovementInform(), boss_ayamiss::MovementInform(), boss_taldaram::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_spire_frostwyrm::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), npc_oculus_drake::npc_oculus_drakeAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), npc_hallows_end_soh::MovementInform(), boss_headless_horseman::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_kaelthas::MovementInform(), npc_pet_dk_ebon_gargoyle::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_alexstrasza::npc_alexstraszaAI::npc_alexstraszaAI(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_gothik_trigger::npc_gothik_triggerAI::npc_gothik_triggerAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::npc_icc_nerubar_broodkeeperAI(), npc_korkron_or_wildhammer::npc_korkron_or_wildhammer(), npc_nightbane_helper_target::npc_nightbane_helper_target(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::npc_ulduar_aerial_command_unitAI(), spell_chapter5_light_of_dawn_aura::OnApply(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), spell_q12779_an_end_to_all_things_devour_aura::OnRemove(), spell_chapter5_light_of_dawn_aura::OnRemove(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_jeklik::PathEndReached(), boss_nefarian::PathEndReached(), SmartScript::ProcessAction(), boss_nefarian::Reset(), boss_kalecgos::Reset(), npc_akilzon_eagle::Reset(), boss_jeklik::Reset(), npc_soh_fire_trigger::Reset(), npc_hallows_end_soh::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_ayamiss::Reset(), boss_jedoga_shadowseeker::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), npc_spinestalker::npc_spinestalkerAI::Reset(), npc_rimefang::npc_rimefangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_icc_spire_frostwyrm::Reset(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), boss_illidan_stormrage::Reset(), boss_nazan::Reset(), boss_kaelthas::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), Creature::setDeathState(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_highborne_lamenter::npc_highborne_lamenterAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_onyxia::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), and Creature::UpdateMovementFlags().

◆ SetDisplayId()

◆ SetDualWieldMode()

virtual void Unit::SetDualWieldMode ( DualWieldMode  mode)
inlinevirtual
965{ _dualWieldMode = mode; }

References _dualWieldMode.

Referenced by Creature::InitEntry(), and Creature::UpdateEntry().

◆ SetEmoteState()

void Unit::SetEmoteState ( Emote  emoteState)
inline

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20497{
20498 Movement::MoveSplineInit init(this);
20499 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20501 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20502 init.SetFacing(ori);
20503 init.Launch();
20504}
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:764
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:19003

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), UtherBatteredHiltEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_illidan_stormrage::ScheduleAbilities(), boss_nightbane::ScheduleFly(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_hadronox_crusherPackAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object,
Milliseconds  timed = 0ms 
)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20507{
20508 // never face when already moving
20509 if (!IsStopped())
20510 return;
20511
20513 Movement::MoveSplineInit init(this);
20514 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20515 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20516 init.Launch();
20517
20518 if (timed > 0ms)
20519 {
20520 if (Creature* c = ToCreature())
20521 {
20522 c->m_Events.AddEventAtOffset([c]()
20523 {
20524 if (c->IsInWorld() && c->FindMap() && c->IsAlive() && !c->IsInCombat())
20525 c->SetFacingTo(c->GetHomePosition().GetOrientation());
20526 }, timed);
20527 }
20528 else
20529 LOG_ERROR("entities.unit", "Unit::SetFacingToObject called on non-creature unit {}. This should never happen.", GetEntry());
20530 }
20531}
bool IsStopped() const
Definition Unit.h:1742

References Position::GetAngle(), Object::GetEntry(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), LOG_ERROR, Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and Object::ToCreature().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), npc_forest_frog::DoSpawnRandom(), Spell::EffectSummonType(), spell_chapter5_return_to_capital::HandleHit(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), npc_overlord_drakuru_betrayal::JustSummoned(), boss_illidan_stormrage::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), npc_acherus_necromancer::npc_acherus_necromancerAI::MovementInform(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), npc_akama_illidan::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
10236{
10238 if (IsCreature())
10240}
void UpdateMoveInLineOfSightState()
Definition Creature.cpp:2594

References Object::IsCreature(), SetUInt32Value(), Object::ToCreature(), UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kalecgos::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), BattlegroundAB::NodeOccupied(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_oculus::instance_oculus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), InstanceScript::OnPlayerEnter(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_overlord_drakuru_betrayal::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), npc_deathstalker_fearleia::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18534{
18535 if (apply)
18536 {
18537 SetTarget();
18538 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18539 }
18540 else
18541 {
18542 if (IsAlive())
18543 {
18544 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18545 {
18547 StopMoving();
18548 }
18549
18550 if (GetVictim())
18552 }
18553 }
18554
18555 // xinef: block / allow control to real mover (eg. charmer)
18556 if (IsPlayer())
18557 {
18558 if (m_movedByPlayer)
18559 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18560 //else
18561 // ToPlayer()->SetClientControl(this, !apply);
18562 }
18563}
@ FLEEING_MOTION_TYPE
Definition MotionMaster.h:49
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition WorldConfig.h:238
void MoveFleeing(Unit *enemy, uint32 time=0)
Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:795

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), MotionMaster::GetMotionSlotType(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

void Unit::SetFeatherFall ( bool  enable)
20644{
20645 bool isClientControlled = IsClientControlled();
20646
20647 if (!isClientControlled)
20648 {
20649 if (enable)
20651 else
20653 }
20654
20655 if (!IsInWorld()) // is sent on add to map
20656 return;
20657
20658 if (isClientControlled)
20659 {
20660 if (Player const* player = GetClientControlling())
20661 {
20662 uint32 const counter = player->GetSession()->GetOrderCounter();
20663
20665
20666 data << GetPackGUID();
20667 data << counter;
20668 player->SendDirectMessage(&data);
20669 player->GetSession()->IncrementOrderCounter();
20670
20671 // start fall from current height
20672 if (!enable)
20673 const_cast<Player*>(player)->SetFallInformation(0, GetPositionZ());
20674
20675 return;
20676 }
20677 }
20678
20680 data << GetPackGUID();
20681 SendMessageToSet(&data, true);
20682}
@ MOVEMENTFLAG_FALLING_SLOW
Definition UnitDefines.h:398
@ SMSG_MOVE_FEATHER_FALL
Definition Opcodes.h:272
@ SMSG_MOVE_NORMAL_FALL
Definition Opcodes.h:273
@ SMSG_SPLINE_MOVE_NORMAL_FALL
Definition Opcodes.h:804

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), Position::GetPositionZ(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_FALLING_SLOW, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_FEATHER_FALL, SMSG_MOVE_NORMAL_FALL, SMSG_SPLINE_MOVE_FEATHER_FALL, and SMSG_SPLINE_MOVE_NORMAL_FALL.

Referenced by AuraEffect::HandleAuraFeatherFall(), and debug_commandscript::HandleDebugMoveflagsCommand().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15714{
15716 val = 0;
15717 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15718 val = 1;
15719 else
15720 {
15721 uint32 maxHealth = GetMaxHealth();
15722 if (maxHealth < val)
15723 val = maxHealth;
15724 }
15725
15726 float prevHealthPct = GetHealthPct();
15727
15729
15730 // mobs that are now or were below 30% need to update their speed
15731 if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15732 {
15733 UpdateSpeed(MOVE_RUN, false);
15734 }
15735
15736 // group update
15737 if (IsPlayer())
15738 {
15739 Player* player = ToPlayer();
15740 if (player->NeedSendSpectatorData())
15742
15743 if (player->GetGroup())
15745 }
15746 else if (Pet* pet = ToCreature()->ToPet())
15747 {
15748 if (pet->isControlled())
15749 {
15750 if (Unit* owner = GetOwner())
15751 if (Player* player = owner->ToPlayer())
15752 {
15753 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15754 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15755
15756 if (player->GetGroup())
15758 }
15759 }
15760 }
15761}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition Group.h:113
bool NeedSendSpectatorData() const
Definition Player.cpp:15513
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2488
float GetHealthPct() const
Definition Unit.h:1095
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition ArenaSpectator.h:62

References Dead, WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), Object::IsCreature(), IsPet(), Object::IsPlayer(), JustDied, MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by Battleground::AddPlayer(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::HandleScript(), spell_ahune_synch_health::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

void Unit::SetHover ( bool  enable)
20685{
20686 bool isClientControlled = IsClientControlled();
20687
20688 if (!isClientControlled)
20689 {
20690 if (enable)
20692 else
20694 }
20695
20696 float hoverHeight = GetHoverHeight();
20697
20698 if (enable)
20699 {
20700 if (hoverHeight && GetPositionZ() - GetMap()->GetHeight(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ()) < hoverHeight)
20701 Relocate(GetPositionX(), GetPositionY(), GetPositionZ() + hoverHeight);
20702 }
20703 else
20704 {
20705 if (IsAlive() || !IsUnit())
20706 {
20707 float newZ = std::max<float>(GetMap()->GetHeight(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ()), GetPositionZ() - hoverHeight);
20710 }
20711 }
20712
20713 if (!IsInWorld()) // is sent on add to map
20714 return;
20715
20716 if (isClientControlled)
20717 {
20718 if (Player const* player = GetClientControlling())
20719 {
20721
20722 uint32 const counter = player->GetSession()->GetOrderCounter();
20723
20724 data << GetPackGUID();
20725 data << counter;
20726 player->SendDirectMessage(&data);
20727 player->GetSession()->IncrementOrderCounter();
20728 return;
20729 }
20730 }
20731
20733 data << GetPackGUID();
20734 SendMessageToSet(&data, true);
20735}
bool IsUnit() const
Definition Object.h:208
float GetHoverHeight() const
Definition Unit.h:1697
uint32 GetPhaseMask() const
Definition Object.h:512
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition Object.cpp:1580
@ SMSG_MOVE_SET_HOVER
Definition Opcodes.h:274
@ SMSG_SPLINE_MOVE_UNSET_HOVER
Definition Opcodes.h:806
@ SMSG_MOVE_UNSET_HOVER
Definition Opcodes.h:275

References MovementInfo::AddMovementFlag(), GetClientControlling(), GetHoverHeight(), WorldObject::GetMap(), Object::GetPackGUID(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsAlive(), IsClientControlled(), Object::IsInWorld(), Object::IsUnit(), WorldObject::m_movementInfo, MOVEMENTFLAG_HOVER, Position::Relocate(), MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_SET_HOVER, SMSG_MOVE_UNSET_HOVER, SMSG_SPLINE_MOVE_SET_HOVER, SMSG_SPLINE_MOVE_UNSET_HOVER, and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_taldaram::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_illidan_stormrage::DoAction(), AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_taldaram::InitializeAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_saviana_ragefire::boss_saviana_ragefireAI::JustReachedHome(), boss_taldaram::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_korkron_or_wildhammer::npc_korkron_or_wildhammer(), boss_jedoga_shadowseeker::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_illidan_stormrage::Reset(), setDeathState(), Creature::setDeathState(), boss_jedoga_shadowseeker::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), and Creature::UpdateMovementFlags().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
914{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13768

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_felblood_kaelthas::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned_aura::HandleEffectApply(), spell_uldaman_stoned_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), instance_zulaman::instance_zulaman_InstanceMapScript::OnCreatureCreate(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), npc_thassarian::npc_thassarianAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13760{
13761 (void)keepCombat;
13762 if (apply)
13764 else
13766}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_overlord_drakuru_betrayal::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_tenris_mirkblood::EnterEvadeMode(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), boss_felmyst::InitializeAI(), boss_blackheart_the_inciter::JustEngagedWith(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_tenris_mirkblood::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_wild_wyrm::Reset(), npc_overlord_drakuru_betrayal::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_overlord_drakuru_betrayal::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_wild_wyrm::SpellHit(), boss_felmyst::StartIntro(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_overlord_drakuru_betrayal::UpdateAI(), and npc_magister_aledis::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13891{
13892 // only alive units can be in combat
13893 if (!IsAlive())
13894 return;
13895
13896 if (PvP)
13897 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13898 else if (duration)
13899 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13900
13902 return;
13903
13904 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13905 if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself())
13906 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13907
13908 if (IsInCombat())
13909 return;
13910
13912
13913 if (Creature* creature = ToCreature())
13914 {
13915 // Set home position at place of engaging combat for escorted creatures
13916 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13917 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13918 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13919 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13920
13921 if (enemy)
13922 {
13923 creature->UpdateLeashExtensionTime();
13924
13925 if (IsAIEnabled)
13926 creature->AI()->JustEngagedWith(enemy);
13927
13928 if (creature->GetFormation())
13929 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13930
13931 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13932 }
13933
13934 creature->RefreshSwimmingFlag();
13935
13936 if (IsPet())
13937 {
13938 UpdateSpeed(MOVE_RUN, true);
13939 UpdateSpeed(MOVE_SWIM, true);
13940 UpdateSpeed(MOVE_FLIGHT, true);
13941 }
13942
13943 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13944 Dismount();
13945 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13947 }
13948
13949 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13950 {
13951 Unit* controlled = *itr;
13952 ++itr;
13953
13954 // Xinef: Dont set combat for passive units, they will evade in next update...
13955 if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13956 continue;
13957
13958 controlled->SetInCombatState(PvP, enemy, duration);
13959 }
13960
13961 if (Player* player = this->ToPlayer())
13962 {
13963 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13964 }
13965}
@ ESCORT_MOTION_TYPE
Definition MotionMaster.h:57
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
@ CREATURE_TYPE_NON_COMBAT_PET
Definition SharedDefines.h:2650
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition SharedDefines.h:2717
@ MOVE_FLIGHT
Definition UnitDefines.h:359
@ MOVE_SWIM
Definition UnitDefines.h:356
bool HasReactState(ReactStates state) const
Definition Creature.h:101
uint32 GetCombatTimer() const
Definition Unit.h:934
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition Unit.cpp:13890
bool IsStandState() const
Definition Unit.cpp:16943

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), Object::IsCreature(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13733{
13734 // Xinef: Dont allow to start combat with triggers
13735 if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger())
13736 return;
13737
13738 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13739 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13740 {
13741 SetInCombatState(true, enemy, duration);
13742 return;
13743 }
13744
13745 // check for duel
13746 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13747 {
13748 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13749 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13750 {
13751 SetInCombatState(true, enemy, duration);
13752 return;
13753 }
13754 }
13755
13756 SetInCombatState(false, enemy, duration);
13757}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::IsCreature(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), and Object::ToPlayer().

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1571{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
994{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1136{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

void Unit::SetLevel ( uint8  lvl,
bool  showLevelChange = true 
)

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15764{
15765 if (!val)
15766 val = 1;
15767
15768 uint32 health = GetHealth();
15770
15771 // group update
15772 if (IsPlayer())
15773 {
15774 Player* player = ToPlayer();
15775 if (player->NeedSendSpectatorData())
15777
15778 if (player->GetGroup())
15780 }
15781 else if (Pet* pet = ToCreature()->ToPet())
15782 {
15783 if (pet->isControlled())
15784 {
15785 if (Unit* owner = GetOwner())
15786 if (Player* player = owner->ToPlayer())
15787 {
15788 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15789 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15790
15791 if (player->GetGroup())
15793 }
15794 }
15795 }
15796
15797 if (val < health)
15798 SetHealth(val);
15799}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), Creature::SelectLevel(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15853{
15854 uint32 cur_power = GetPower(power);
15855 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15856
15857 // group update
15858 if (IsPlayer())
15859 {
15860 Player* player = ToPlayer();
15861 if (getPowerType() == power && player->NeedSendSpectatorData())
15862 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15863
15864 if (player->GetGroup())
15866 }
15867 else if (Pet* pet = ToCreature()->ToPet())
15868 {
15869 if (pet->isControlled())
15870 {
15871 Unit* owner = GetOwner();
15872 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15874 }
15875 }
15876
15877 if (val < cur_power)
15878 SetPower(power, val);
15879}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition Object.cpp:787

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10890{
10891 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10892
10893 if (apply)
10894 {
10895 if (minion->GetOwnerGUID())
10896 {
10897 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10898 return;
10899 }
10900
10901 minion->SetOwnerGUID(GetGUID());
10902
10903 m_Controlled.insert(minion);
10904
10905 if (IsPlayer())
10906 {
10907 minion->m_ControlledByPlayer = true;
10909 }
10910
10911 // Can only have one pet. If a new one is summoned, dismiss the old one.
10912 if (minion->IsGuardianPet())
10913 {
10914 if (Guardian* oldPet = GetGuardianPet())
10915 {
10916 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10917 {
10918 // remove existing minion pet
10919 if (Pet* oldPetAsPet = oldPet->ToPet())
10920 {
10921 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10922 }
10923 else
10924 {
10925 oldPet->UnSummon();
10926 }
10927
10928 SetPetGUID(minion->GetGUID());
10930 }
10931 }
10932 else
10933 {
10934 SetPetGUID(minion->GetGUID());
10936 }
10937 }
10938
10940 {
10942 }
10943
10944 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10945 {
10946 SetCritterGUID(minion->GetGUID());
10947 }
10948
10949 // PvP, FFAPvP
10951
10952 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10953 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10954 minion->setPowerType(POWER_ENERGY);
10955
10956 if (IsPlayer())
10957 {
10958 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10959 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10960
10961 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10962 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10963 }
10964 }
10965 else
10966 {
10967 if (minion->GetOwnerGUID() != GetGUID())
10968 {
10969 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10970 return;
10971 }
10972
10973 m_Controlled.erase(minion);
10974
10975 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10976 {
10977 if (GetCritterGUID() == minion->GetGUID())
10979 }
10980
10981 if (minion->IsGuardianPet())
10982 {
10983 if (GetPetGUID() == minion->GetGUID())
10985 }
10986 else if (minion->IsTotem())
10987 {
10988 // All summoned by totem minions must disappear when it is removed.
10989 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10990 {
10991 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10992 {
10993 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10994 continue;
10995
10996 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10997 }
10998 }
10999 }
11000
11001 if (IsPlayer())
11002 {
11003 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
11004 // Remove infinity cooldown
11005 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
11006 ToPlayer()->SendCooldownEvent(spellInfo);
11007
11008 // xinef: clear spell book
11009 if (m_Controlled.empty())
11011 }
11012
11013 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
11014 {
11016 {
11017 // Check if there is another minion
11018 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
11019 {
11020 // do not use this check, creature do not have charm guid
11021 //if (GetCharmGUID() == (*itr)->GetGUID())
11022 if (GetGUID() == (*itr)->GetCharmerGUID())
11023 continue;
11024
11025 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
11026 if ((*itr)->GetOwnerGUID() != GetGUID())
11027 {
11028 OutDebugInfo();
11029 (*itr)->OutDebugInfo();
11030 ABORT();
11031 }
11032 ASSERT((*itr)->IsCreature());
11033
11034 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLLABLE_GUARDIAN))
11035 continue;
11036
11037 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
11038 {
11039 // show another pet bar if there is no charm bar
11040 if (IsPlayer() && !GetCharmGUID())
11041 {
11042 if ((*itr)->IsPet())
11044 else
11046 }
11047 }
11048 break;
11049 }
11050 }
11051 }
11052 }
11053}
@ PET_SAVE_NOT_IN_SLOT
Definition PetDefines.h:46
@ SPELL_EFFECT_SUMMON
Definition SharedDefines.h:817
@ SUMMON_TYPE_MINIPET
Definition SharedDefines.h:3549
bool IsGuardianPet() const
Definition TemporarySummon.cpp:390
bool IsPetGhoul() const
Definition TemporarySummon.h:85
void PetSpellInitialize()
Definition Player.cpp:9556
const SummonPropertiesEntry *const m_Properties
Definition TemporarySummon.h:64
uint32 GetSpell(uint8 slot=0) const
Definition Totem.h:59
void OutDebugInfo() const
Definition Unit.cpp:20209
ObjectGuid GetCritterGUID() const
Definition Unit.h:715
void SetOwnerGUID(ObjectGuid owner)
Definition Unit.cpp:10777
void SetCritterGUID(ObjectGuid guid)
Definition Unit.h:714
void setPowerType(Powers power)
Definition Unit.cpp:10158
void RemoveAllMinionsByEntry(uint32 entry)
Definition Unit.cpp:11067
uint32 Type
Definition DBCStructure.h:1911

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
754{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::JustReachedHome(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_akama_illidan::PathEndReached(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_deathstalker_fearleia::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), Vehicle::Vehicle(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10778{
10779 if (GetOwnerGUID() == owner)
10780 return;
10781
10783 if (!owner)
10784 return;
10785
10786 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10787
10788 // Update owner dependent fields
10789 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10790 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10791 return;
10792
10794
10795 UpdateData udata;
10796 WorldPacket packet;
10797 BuildValuesUpdateBlockForPlayer(&udata, player);
10798 udata.BuildPacket(packet);
10799 player->SendDirectMessage(&packet);
10800
10802}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:246
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:195
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:194
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11435
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19297{
19298 if (newPhaseMask == GetPhaseMask())
19299 return;
19300
19301 if (IsInWorld())
19302 {
19303 // xinef: to comment, bellow line should be removed
19304 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19305 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19306
19307 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19308 return;
19309
19310 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19311 if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19312 {
19313 HostileRefMgr& refMgr = getHostileRefMgr();
19314 HostileReference* ref = refMgr.getFirst();
19315
19316 while (ref)
19317 {
19318 if (Unit* unit = ref->GetSource()->GetOwner())
19319 if (Creature* creature = unit->ToCreature())
19320 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19321
19322 ref = ref->next();
19323 }
19324
19325 // modify threat lists for new phasemask
19326 if (!IsPlayer())
19327 {
19330
19331 // merge expects sorted lists
19332 threatList.sort();
19333 offlineThreatList.sort();
19334 threatList.merge(offlineThreatList);
19335
19336 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19337 if (Unit* unit = (*itr)->getTarget())
19338 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19339 }
19340 }
19341 }
19342
19343 WorldObject::SetPhaseMask(newPhaseMask, false);
19344
19345 if (!IsInWorld())
19346 {
19347 return;
19348 }
19349
19350 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19351 {
19352 Unit* controlled = *itr;
19353 ++itr;
19354 if (controlled->IsCreature())
19355 {
19356 controlled->SetPhaseMask(newPhaseMask, true);
19357 }
19358 }
19359
19360 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19361 {
19362 if (m_SummonSlot[i])
19363 {
19364 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19365 {
19366 summon->SetPhaseMask(newPhaseMask, true);
19367 }
19368 }
19369 }
19370
19371 if (update)
19372 {
19374 }
19375}
Definition HostileRefMgr.h:31
void setOnlineOfflineState(bool isOnline)
Definition HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition HostileRefMgr.h:59
HostileReference * next()
Definition ThreatMgr.h:115
FROM * GetSource() const
Definition Reference.h:97
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition ThreatMgr.h:274
Unit * GetOwner() const
Definition ThreatMgr.h:236
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Unit.cpp:19296
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:2884

References Map::GetCreature(), HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::InSamePhase(), Object::IsCreature(), Object::IsInWorld(), Object::IsPlayer(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), BattlegroundAB::RemovePlayer(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_volazj::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15802{
15803 if (!fromRegenerate && GetPower(power) == val)
15804 return;
15805
15806 uint32 maxPower = GetMaxPower(power);
15807 if (maxPower < val)
15808 val = maxPower;
15809
15810 if (fromRegenerate)
15811 {
15814 }
15815 else
15817
15818 if (withPowerUpdate)
15819 {
15820 WorldPacket data(SMSG_POWER_UPDATE, 8 + 1 + 4);
15821 data << GetPackGUID();
15822 data << uint8(power);
15823 data << uint32(val);
15824 SendMessageToSet(&data, IsPlayer());
15825 }
15826
15827 // group update
15828 if (IsPlayer())
15829 {
15830 Player* player = ToPlayer();
15831 if (getPowerType() == power && player->NeedSendSpectatorData())
15832 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15833
15834 if (player->GetGroup())
15836 }
15837 else if (Pet* pet = ToCreature()->ToPet())
15838 {
15839 if (pet->isControlled())
15840 {
15841 Unit* owner = GetOwner();
15842 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15844 }
15845
15846 // Update the pet's character sheet with happiness damage bonus
15847 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15848 pet->UpdateDamagePhysical(BASE_ATTACK);
15849 }
15850}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition Group.h:104
void UpdateUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:652
void AddToObjectUpdateIfNeeded()
Definition Object.cpp:513
@ SMSG_POWER_UPDATE
Definition Opcodes.h:1182

References Object::AddToObjectUpdateIfNeeded(), AsUnderlyingType(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
10159{
10160 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
10161
10162 if (IsPlayer())
10163 {
10164 if (ToPlayer()->GetGroup())
10166 }
10167 else if (Pet* pet = ToCreature()->ToPet())
10168 {
10169 if (pet->isControlled())
10170 {
10171 Unit* owner = GetOwner();
10172 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
10174 }
10175 }
10176
10177 float powerMultiplier = 1.0f;
10178 if (!IsPet())
10179 if (Creature* creature = ToCreature())
10180 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
10181
10182 switch (new_powertype)
10183 {
10184 default:
10185 case POWER_MANA:
10186 break;
10187 case POWER_RAGE:
10188 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10189 SetPower(POWER_RAGE, 0);
10190 break;
10191 case POWER_FOCUS:
10192 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10193 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10194 break;
10195 case POWER_ENERGY:
10196 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10197 break;
10198 case POWER_HAPPINESS:
10199 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10200 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10201 break;
10202 }
10203
10204 if (Player const* player = ToPlayer())
10205 if (player->NeedSendSpectatorData())
10206 {
10207 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10208 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10209 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10210 }
10211}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition Unit.cpp:15852

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
21112{
21113 if (IsPlayer())
21114 m_race = race;
21115}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
950{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition ThreatMgr.h:301

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  stun = false,
bool  logout = false 
)
protected
18461{
18462 const uint32 state = (stun ? (logout ? UNIT_STATE_LOGOUT_TIMER : UNIT_STATE_STUNNED) : UNIT_STATE_ROOT);
18463
18464 if (apply)
18465 {
18466 AddUnitState(state);
18467
18468 SendMoveRoot(true);
18469 }
18470 else
18471 {
18472 ClearUnitState(state);
18473
18474 // Prevent giving ability to move if more immobilizers are active
18475 if (!IsImmobilizedState())
18476 SendMoveRoot(false);
18477 }
18478}
@ UNIT_STATE_LOGOUT_TIMER
Definition UnitDefines.h:202
bool IsImmobilizedState() const
Definition Unit.h:775
void SendMoveRoot(bool state)
Definition Unit.cpp:18480

References AddUnitState(), ClearUnitState(), IsImmobilizedState(), SendMoveRoot(), UNIT_STATE_LOGOUT_TIMER, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandlePlayerLoginToCharInWorld(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
21354{
21356 sScriptMgr->OnUnitSetShapeshiftForm((Unit*)this, form);
21357}

References Object::SetByteValue(), sScriptMgr, and UNIT_FIELD_BYTES_2.

Referenced by AuraEffect::HandleAuraModShapeshift(), and reset_commandscript::HandleResetStatsOrLevelHelper().

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14594{
14595 if (rate < 0)
14596 rate = 0.0f;
14597
14598 // Update speed only on change
14599 if (m_speed_rate[mtype] == rate)
14600 return;
14601
14602 m_speed_rate[mtype] = rate;
14603
14605
14606 SpeedOpcodePair const& speedOpcodes = SetSpeed2Opc_table[mtype];
14607
14608 if (forced && IsClientControlled())
14609 {
14610 Player* player = const_cast<Player*>(GetClientControlling());
14611 uint32 const counter = player->GetSession()->GetOrderCounter();
14612
14613 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14614 // and do it only for real sent packets and use run for run/mounted as client expected
14615 ++player->m_forced_speed_changes[mtype];
14616
14617 WorldPacket data(speedOpcodes[static_cast<size_t>(SpeedOpcodeIndex::PC)], 18);
14618 data << GetPackGUID();
14619 data << counter;
14620 if (mtype == MOVE_RUN)
14621 data << uint8(0); // new 2.1.0
14622
14623 data << GetSpeed(mtype);
14624 player->GetSession()->SendPacket(&data);
14625 player->GetSession()->IncrementOrderCounter();
14626 }
14627 else if (forced)
14628 {
14629 WorldPacket data(speedOpcodes[static_cast<size_t>(SpeedOpcodeIndex::NPC)], 12);
14630 data << GetPackGUID();
14631 data << float(GetSpeed(mtype));
14632 SendMessageToSet(&data, true);
14633 }
14634
14635 if (IsPlayer())
14636 {
14637 // Xinef: update speed of pet also
14638 if (!IsInCombat())
14639 {
14640 Unit* pet = ToPlayer()->GetPet();
14641 if (!pet)
14642 pet = GetCharm();
14643
14644 // xinef: do not affect vehicles and possesed pets
14645 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14646 pet = nullptr;
14647
14648 if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
14649 pet->UpdateSpeed(mtype, forced);
14650
14651 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14652 critter->UpdateSpeed(mtype, forced);
14653 }
14654 ToPlayer()->SetCanTeleport(true);
14655 }
14656}
@ FOLLOW_MOTION_TYPE
Definition MotionMaster.h:54
const Opcodes SpeedOpcodePair[static_cast< size_t >(SpeedOpcodeIndex::MAX)]
Definition Unit.h:640
SpeedOpcodePair SetSpeed2Opc_table[MAX_MOVE_TYPE]
Definition Unit.h:641
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:949
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition Player.h:2414
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:14588
void propagateSpeedChange()
Definition Unit.h:1725

References FOLLOW_MOTION_TYPE, GetCharm(), GetClientControlling(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), Player::GetPet(), Player::GetSession(), GetSpeed(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldSession::IncrementOrderCounter(), IsClientControlled(), Object::IsCreature(), IsInCombat(), Object::IsPlayer(), IsVehicle(), Player::m_forced_speed_changes, m_speed_rate, MOVE_RUN, NPC, PC, propagateSpeedChange(), WorldObject::SendMessageToSet(), WorldSession::SendPacket(), Player::SetCanTeleport(), SetSpeed2Opc_table, Object::ToPlayer(), UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::DoAction(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_volkhan::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), npc_zuljin_vortex::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::UpdateAI(), boss_onyxia::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16959{
16961
16962 if (IsStandState())
16964
16965 if (IsPlayer())
16966 {
16968 data << (uint8)state;
16969 ToPlayer()->SendDirectMessage(&data);
16970 }
16971}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), Player::SendDirectMessage(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), spell_the_cleansing_cleansing_soul::AfterApply(), spell_the_cleansing_cleansing_soul::AfterRemove(), boss_kologarn::boss_kologarnAI::boss_kologarnAI(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::DamageTaken(), boss_alar::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::DoAction(), boss_illidan_stormrage::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), DistractMovementGenerator::Initialize(), boss_felmyst::InitializeAI(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::boss_kologarnAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosa(), spell_love_is_in_the_air_romantic_picnic::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), spell_q12937_relief_for_the_fallen::OnRemove(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), WorldSession::ProcessMovementInfo(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_illidan_stormrage::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), advisor_baseAI::SpellHit(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStatFlatModifier()

void Unit::SetStatFlatModifier ( UnitMods  unitMod,
UnitModifierFlatType  modifierType,
float  val 
)

◆ SetStatPctModifier()

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18415{
18416 if (IsInFlight())
18417 return;
18418
18419 if (apply)
18420 {
18421 SetTarget();
18423
18424 if (IsPlayer())
18425 {
18427 }
18428
18429 SetRooted(true, true);
18430
18431 CastStop();
18432 }
18433 else
18434 {
18435 if (IsAlive() && GetVictim())
18437
18438 if (IsCreature())
18439 {
18440 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18441 Unit* owner = GetOwner();
18442 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18444
18445 // Xinef: same for charmed npcs
18446 owner = GetCharmer();
18447 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18449 }
18450 else
18452
18453 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18454 {
18455 SetRooted(false, true);
18456 }
18457 }
18458}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), GetVictim(), HasUnitState(), IsAlive(), Object::IsCreature(), IsInFlight(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
1946{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21415{
21416 Object::SetUInt32Value(index, value);
21417
21418 switch (index)
21419 {
21420 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21421 // We might also need to invalidate the cache for some other fields as well.
21422 case UNIT_FIELD_HEALTH:
21424 break;
21425 }
21426}
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:639
void InvalidateValuesUpdateCache()
Definition Unit.h:2207

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), Dismount(), npc_harrison_jones::DoAction(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_illidan_stormrage::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::boss_xt002AI::JustEngagedWith(), npc_dragonflayer_forge_master::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_harrison_jones::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_akama_illidan::MovementInform(), npc_thassarian2::npc_thassarian2AI::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), WorldSession::ProcessMovementInfo(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), Player::setDeathState(), SetDisplayId(), SetEmoteState(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), SetVirtualItem(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

738{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by BattlegroundAV::AddAVCreature(), Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), advisor_baseAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_amanishi_lookout::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), SACDeactivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_ingvar_the_plunderer::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::boss_kologarnAI::JustDied(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_novos::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_blade_of_azzinoth::npc_blade_of_azzinoth(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heartAI::npc_xt002_heartAI(), spell_halion_twilight_phasing_aura::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kiljaeden::Reset(), npc_zuljin_vortex::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::Reset(), boss_cthun::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::boss_malygosAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), npc_drakuru_shackles::npc_drakuru_shacklesAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), boss_kaelthas::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), Player::SetBeastMaster(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), npc_netherspite_infernal::SpellHit(), npc_harrison_jones::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_anub_arak::SpellHitTarget(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVirtualItem()

void Unit::SetVirtualItem ( uint32  slot,
uint32  itemId 
)
21268{
21269 if (slot >= MAX_EQUIPMENT_ITEMS)
21270 return;
21271
21273}

References MAX_EQUIPMENT_ITEMS, SetUInt32Value(), and UNIT_VIRTUAL_ITEM_SLOT_ID.

Referenced by ScriptedAI::SetEquipmentSlots().

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14397{
14398 if (!x)
14400 else
14402
14404}
@ SEC_GAMEMASTER
Definition Common.h:59

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by Creature::Create(), boss_muru::DamageTaken(), boss_alar::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::MoveInLineOfSight(), npc_enslaved_netherwing_drake::MovementInform(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosa(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::npc_time_lost_proto_drakeAI(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_overlord_drakuru_betrayal::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20534{
20535 if (enable == IsWalking())
20536 return false;
20537
20538 if (enable)
20540 else
20542
20544 return true;
20545}

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

void Unit::SetWaterWalking ( bool  enable)
20738{
20739 bool isClientControlled = IsClientControlled();
20740
20741 if (!isClientControlled)
20742 {
20743 if (enable)
20745 else
20747 }
20748
20749 if (!IsInWorld()) // is sent on add to map
20750 return;
20751
20752 if (isClientControlled)
20753 {
20754 if (Player const* player = GetClientControlling())
20755 {
20756 uint32 const counter = player->GetSession()->GetOrderCounter();
20757
20758 WorldPacket data(enable ? SMSG_MOVE_WATER_WALK : SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4);
20759 data << GetPackGUID();
20760 data << counter;
20761 player->SendDirectMessage(&data);
20762 player->GetSession()->IncrementOrderCounter();
20763 return;
20764 }
20765 }
20766
20768 data << GetPackGUID();
20769 SendMessageToSet(&data, true);
20770}
@ MOVEMENTFLAG_WATERWALKING
Definition UnitDefines.h:397
@ SMSG_MOVE_LAND_WALK
Definition Opcodes.h:253
@ SMSG_SPLINE_MOVE_LAND_WALK
Definition Opcodes.h:808
@ SMSG_MOVE_WATER_WALK
Definition Opcodes.h:252

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_WATERWALKING, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_LAND_WALK, SMSG_MOVE_WATER_WALK, SMSG_SPLINE_MOVE_LAND_WALK, and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::BuildPlayerRepop(), AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), cheat_commandscript::HandleWaterWalkCheatCommand(), and Player::ResurrectPlayer().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
12137{
12138 int32 DoneAdvertisedBenefit = GetTotalAuraModifier(SPELL_AURA_MOD_DAMAGE_DONE, [schoolMask](AuraEffect const* aurEff)
12139 {
12140 return aurEff->GetMiscValue() & schoolMask &&
12141 // -1 == any item class (not wand then)
12142 aurEff->GetSpellInfo()->EquippedItemClass == -1 &&
12143 // 0 == any inventory type (not wand then)
12145 });
12146
12147 if (IsPlayer())
12148 {
12149 // Base value
12150 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12151 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellDamageBonus();
12152
12153 // Damage bonus from stats
12155 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
12156 {
12157 if ((*i)->GetMiscValue() & schoolMask)
12158 {
12159 // stat used stored in miscValueB for this aura
12160 Stats usedStat = Stats((*i)->GetMiscValueB());
12161 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12162 }
12163 }
12164 // ... and attack power
12166 }
12167 return DoneAdvertisedBenefit;
12168}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition Player.h:1968
uint32 GetBaseSpellDamageBonus()
Definition Player.h:1969
int32 EquippedItemInventoryTypeMask
Definition SpellInfo.h:377

References BASE_ATTACK, CalculatePct(), SpellInfo::EquippedItemClass, SpellInfo::EquippedItemInventoryTypeMask, GetAuraEffectsByType(), Player::GetBaseSpellDamageBonus(), Player::GetBaseSpellPowerBonus(), AuraEffect::GetMiscValue(), AuraEffect::GetSpellInfo(), GetStat(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
12171{
12172 return GetTotalAuraModifier(SPELL_AURA_MOD_DAMAGE_TAKEN, [schoolMask, isDoT](AuraEffect const* aurEff)
12173 {
12174 return (aurEff->GetMiscValue() & schoolMask) != 0
12175 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
12176 // Xinef: required for hemorrhage & rupture / garrote
12177 && !(isDoT && aurEff->GetBase()->IsUsingCharges() && aurEff->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC);
12178 });
12179}
bool IsUsingCharges() const
Definition SpellAuras.h:201

References AuraEffect::GetBase(), AuraEffect::GetMiscValue(), AuraEffect::GetSpellInfo(), GetTotalAuraModifier(), Aura::IsUsingCharges(), PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcFlags, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12883{
12884 int32 AdvertisedBenefit = 0;
12885
12886 AdvertisedBenefit += GetTotalAuraModifier(SPELL_AURA_MOD_HEALING_DONE, [schoolMask](AuraEffect const* aurEff)
12887 {
12888 return !aurEff->GetMiscValue() || (aurEff->GetMiscValue() & schoolMask) != 0;
12889 });
12890
12891 // Healing bonus of spirit, intellect and strength
12892 if (IsPlayer())
12893 {
12894 // Base value
12895 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12896 AdvertisedBenefit += ToPlayer()->GetBaseSpellHealingBonus();
12897
12898 // Healing bonus from stats
12900 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12901 {
12902 // stat used dependent from misc value (stat index)
12903 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12904 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12905 }
12906
12907 // ... and attack power
12909 }
12910 return AdvertisedBenefit;
12911}
@ SPELL_AURA_MOD_HEALING_DONE
Definition SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition SpellAuraDefines.h:301
uint32 GetBaseSpellHealingBonus()
Definition Player.h:1970

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellHealingBonus(), Player::GetBaseSpellPowerBonus(), AuraEffect::GetMiscValue(), GetStat(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12465{
12466 // Calculate critical bonus
12467 int32 crit_bonus = damage;
12468 float crit_mod = 0.0f;
12469
12470 switch (spellProto->DmgClass)
12471 {
12472 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12475 crit_bonus += damage;
12476 break;
12477 default:
12478 crit_bonus += damage / 2; // for spells is 50%
12479 break;
12480 }
12481
12482 if (caster)
12483 {
12484 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12485
12486 if (victim)
12487 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12488
12489 if (crit_bonus != 0 && crit_mod != 0.0f)
12490 AddPct(crit_bonus, crit_mod);
12491
12492 crit_bonus -= damage;
12493
12494 // adds additional damage to critBonus (from talents)
12495 if (Player* modOwner = caster->GetSpellModOwner())
12496 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12497
12498 crit_bonus += damage;
12499 }
12500
12501 return crit_bonus;
12502}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12505{
12506 // Calculate critical bonus
12507 int32 crit_bonus;
12508 switch (spellProto->DmgClass)
12509 {
12510 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12513 crit_bonus = damage;
12514 break;
12515 default:
12516 crit_bonus = damage / 2; // for spells is 50%
12517 break;
12518 }
12519
12520 if (caster)
12521 {
12522 if (victim)
12523 {
12524 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12525 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12526 }
12527
12528 // adds additional damage to critBonus (from talents)
12529 // xinef: used for death knight death coil
12530 if (Player* modOwner = caster->GetSpellModOwner())
12531 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12532 }
12533
12534 if (crit_bonus > 0)
12535 damage += crit_bonus;
12536
12537 if (caster)
12538 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12539
12540 return damage;
12541}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11818{
11819 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11820 return pdamage;
11821
11822 // Some spells don't benefit from done mods
11823 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11824 return pdamage;
11825
11826 // For totems get damage bonus from owner
11827 if (IsCreature())
11828 {
11829 if (IsTotem())
11830 {
11831 if (Unit* owner = GetOwner())
11832 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11833 }
11834 // Dancing Rune Weapon...
11835 else if (GetEntry() == 27893)
11836 {
11837 if (Unit* owner = GetOwner())
11838 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11839 }
11840 }
11841
11842 // Done total percent damage auras
11843 float ApCoeffMod = 1.0f;
11844 int32 DoneTotal = 0;
11845 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11846
11847 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controlled Damage
11849 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11850
11851 // Some spells don't benefit from pct done mods
11852 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11853 {
11854 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11855 // Add flat bonus from spell damage versus
11857 }
11858
11859 // done scripted mod (take it from owner)
11860 Unit* owner = GetOwner() ? GetOwner() : this;
11861 int32 DoneAdvertisedBenefit = 0;
11862 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11863 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11864 {
11865 if (!(*i)->IsAffectedOnSpell(spellProto))
11866 continue;
11867
11868 switch ((*i)->GetMiscValue())
11869 {
11870 case 4418: // Increased Shock Damage
11871 case 4554: // Increased Lightning Damage
11872 case 4555: // Improved Moonfire
11873 case 5142: // Increased Lightning Damage
11874 case 5147: // Improved Consecration / Libram of Resurgence
11875 case 5148: // Idol of the Shooting Star
11876 case 6008: // Increased Lightning Damage
11877 case 8627: // Totem of Hex
11878 {
11879 DoneAdvertisedBenefit += (*i)->GetAmount();
11880 break;
11881 }
11882 }
11883 }
11884
11885 // Custom scripted damage
11886 switch (spellProto->SpellFamilyName)
11887 {
11888 case SPELLFAMILY_DRUID:
11889 {
11890 // Insect Swarm vs Item - Druid T8 Balance Relic
11891 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11892 {
11893 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11894 {
11895 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11896 }
11897 }
11898
11899 // Nourish vs Idol of the Flourishing Life
11900 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11901 {
11902 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11903 {
11904 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11905 }
11906 }
11907 break;
11908 }
11910 {
11911 // Sigil of the Vengeful Heart
11912 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11913 {
11914 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11915 {
11916 AddPct(DoneTotal, aurEff->GetAmount());
11917 }
11918 }
11919
11920 // Impurity
11922 {
11923 AddPct(ApCoeffMod, aurEff->GetAmount());
11924 }
11925
11926 // Blood Boil - bonus for diseased targets
11927 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11928 {
11929 DoneTotal += 95;
11930 ApCoeffMod = 1.5835f;
11931 }
11932 break;
11933 }
11934 default:
11935 break;
11936 }
11937
11938 // Done fixed damage bonus auras
11939 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11940
11941 // Check for table values
11942 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11943 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11944 if (bonus)
11945 {
11946 if (damagetype == DOT)
11947 {
11948 coeff = bonus->dot_damage;
11949 if (bonus->ap_dot_bonus > 0)
11950 {
11951 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11953 APbonus += GetTotalAttackPowerValue(attType);
11954 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11955 }
11956 }
11957 else
11958 {
11959 coeff = bonus->direct_damage;
11960 if (bonus->ap_bonus > 0)
11961 {
11962 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11964 APbonus += GetTotalAttackPowerValue(attType);
11965 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11966 }
11967 }
11968 }
11969
11970 // Default calculation
11971 if (coeff && DoneAdvertisedBenefit)
11972 {
11973 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11974
11975 if (Player* modOwner = GetSpellModOwner())
11976 {
11977 coeff *= 100.0f;
11978 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11979 coeff /= 100.0f;
11980 }
11981
11982 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11983 }
11984
11985 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11986 // apply spellmod to Done damage (flat and pct)
11987 if (Player* modOwner = GetSpellModOwner())
11988 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11989
11990 return uint32(std::max(tmpDamage, 0.0f));
11991}
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition SharedDefines.h:644
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition SpellAuraDefines.h:243
@ SPELLMOD_DOT
Definition SpellDefines.h:98
@ SPELLMOD_BONUS_MULTIPLIER
Definition SpellDefines.h:100
float GetSpellDamageMod(int32 Rank)
Definition Creature.cpp:1620
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:11489
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition Unit.cpp:3078
Definition SpellMgr.h:323
float ap_dot_bonus
Definition SpellMgr.h:327
float dot_damage
Definition SpellMgr.h:325
float ap_bonus
Definition SpellMgr.h:326
float direct_damage
Definition SpellMgr.h:324

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), Object::IsCreature(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, and Object::ToCreature().

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
11994{
11995 if (!spellProto || damagetype == DIRECT_DAMAGE)
11996 return pdamage;
11997
11998 int32 TakenTotal = 0;
11999 float TakenTotalMod = 1.0f;
12000
12001 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
12002 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
12003 TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto->GetSchoolMask());
12004
12005 TakenTotalMod = processDummyAuras(TakenTotalMod);
12006
12007 // From caster spells
12008 if (caster)
12009 {
12010 TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_FROM_CASTER, [caster, spellProto](AuraEffect const* aurEff) -> bool
12011 {
12012 if (aurEff->GetCasterGUID() == caster->GetGUID() && aurEff->IsAffectedOnSpell(spellProto))
12013 return true;
12014 return false;
12015 });
12016 }
12017
12018 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
12019 {
12020 int32 modifierMax = 0;
12021 int32 modifierMin = 0;
12023 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
12024 {
12025 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
12026 continue;
12027
12028 // Only death knight spell with this aura
12029 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
12030 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
12031 continue;
12032
12033 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
12034 {
12035 if ((*i)->GetAmount() > 0)
12036 {
12037 if ((*i)->GetAmount() > modifierMax)
12038 modifierMax = (*i)->GetAmount();
12039 }
12040 else if ((*i)->GetAmount() < modifierMin)
12041 modifierMin = (*i)->GetAmount();
12042 }
12043 }
12044
12045 AddPct(TakenTotalMod, modifierMax);
12046 AddPct(TakenTotalMod, modifierMin);
12047 }
12048
12049 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
12050
12051 // Check for table values
12052 float coeff = 0;
12053 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12054 if (bonus)
12055 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12056
12057 // Default calculation
12058 if (TakenAdvertisedBenefit)
12059 {
12060 if (coeff <= 0.0f)
12061 {
12062 if (caster)
12063 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
12064 else
12065 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
12066 }
12067
12068 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12069 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
12070 }
12071
12072 // No positive taken bonus, custom attr
12073 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
12074 {
12075 TakenTotal = 0;
12076 TakenTotalMod = 1.0f;
12077 }
12078
12079 // xinef: sanctified wrath talent
12080 if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistAura())
12081 {
12082 float ignoreModifier = 1.0f - TakenTotalMod;
12083 bool addModifier = false;
12085 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
12086 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
12087 {
12088 ApplyPct(ignoreModifier, (*j)->GetAmount());
12089 addModifier = true;
12090 }
12091
12092 if (addModifier)
12093 TakenTotalMod += ignoreModifier;
12094 }
12095
12096 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
12097
12098 return uint32(std::max(tmpDamage, 0.0f));
12099}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition Unit.cpp:17440

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), AuraEffect::GetCasterGUID(), Object::GetGUID(), SpellInfo::GetSchoolMask(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), SpellInfo::Id, AuraEffect::IsAffectedOnSpell(), processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealDamageShieldDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
12182{
12183 // Mobs can't crit with spells.
12184 if (IsCreature() && !GetSpellModOwner())
12185 return -100.0f;
12186
12187 // not critting spell
12188 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12189 return 0.0f;
12190
12191 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12192 if (!skipEffectCheck && !spellProto->IsCritCapable())
12193 return 0.0f;
12194
12195 float crit_chance = 0.0f;
12196 switch (spellProto->DmgClass)
12197 {
12199 {
12200 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12201 crit_chance = 0.0f;
12202 // For other schools
12203 else if (IsPlayer())
12204 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12205 else
12206 {
12207 crit_chance = (float)m_baseSpellCritChance;
12209 }
12210 break;
12211 }
12214 {
12215 if (IsPlayer())
12216 {
12217 switch (attackType)
12218 {
12219 case BASE_ATTACK:
12221 break;
12222 case OFF_ATTACK:
12224 break;
12225 case RANGED_ATTACK:
12227 break;
12228 default:
12229 break;
12230 }
12231 }
12232 else
12233 {
12234 crit_chance = 5.0f;
12237 }
12239 break;
12240 }
12241 // values overridden in spellmgr for lifebloom and earth shield
12243 default:
12244 return 0.0f;
12245 }
12246
12247 // percent done
12248 // only players use intelligence for critical chance computations
12249 if (Player* modOwner = GetSpellModOwner())
12250 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12251
12252 // xinef: can be negative!
12253 return crit_chance;
12254}
@ SPELL_ATTR2_CANT_CRIT
Definition SharedDefines.h:496
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition SpellAuraDefines.h:134
@ SPELLMOD_CRITICAL_CHANCE
Definition SpellDefines.h:83
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition UpdateFields.h:354

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsCritCapable(), Object::IsPlayer(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, and SPELLMOD_CRITICAL_CHANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12629{
12630 // For totems get healing bonus from owner (statue isn't totem in fact)
12631 if (IsCreature() && IsTotem())
12632 if (Unit* owner = GetOwner())
12633 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12634
12635 // No bonus healing for potion spells
12636 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12637 return healamount;
12638
12639 float ApCoeffMod = 1.0f;
12640 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12641 int32 DoneTotal = 0;
12642
12643 // done scripted mod (take it from owner)
12644 Unit* owner = GetOwner() ? GetOwner() : this;
12645 int32 DoneAdvertisedBenefit = 0;
12646 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12647 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12648 {
12649 if (!(*i)->IsAffectedOnSpell(spellProto))
12650 continue;
12651
12652 switch ((*i)->GetMiscValue())
12653 {
12654 case 4415: // Increased Rejuvenation Healing
12655 case 4953:
12656 DoneAdvertisedBenefit += (*i)->GetAmount();
12657 break;
12658 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12659 DoneAdvertisedBenefit += (*i)->GetAmount();
12660 break;
12661 }
12662 }
12663
12664 switch (spellProto->SpellFamilyName)
12665 {
12667 {
12668 // Impurity
12670 {
12671 AddPct(ApCoeffMod, aurEff->GetAmount());
12672 }
12673 break;
12674 }
12675 default:
12676 break;
12677 }
12678
12679 // Done fixed damage bonus auras
12680 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12681 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12682
12683 // Check for table values
12684 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12685 if (bonus)
12686 {
12687 if (damagetype == DOT)
12688 {
12689 coeff = bonus->dot_damage;
12690 if (bonus->ap_dot_bonus > 0)
12691 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12692 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12693 }
12694 else
12695 {
12696 coeff = bonus->direct_damage;
12697 if (bonus->ap_bonus > 0)
12698 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12699 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12700 }
12701 }
12702 else
12703 {
12704 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12705 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12706 return healamount;
12707 }
12708
12709 // Default calculation
12710 if (DoneAdvertisedBenefit)
12711 {
12712 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12713 if (Player* modOwner = GetSpellModOwner())
12714 {
12715 coeff *= 100.0f;
12716 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12717 coeff /= 100.0f;
12718 }
12719 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12720 }
12721
12722 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12723 {
12724 switch (spellProto->Effects[i].ApplyAuraName)
12725 {
12726 // Bonus healing does not apply to these spells
12729 DoneTotal = 0;
12730 break;
12731 default:
12732 break;
12733 }
12734 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12735 DoneTotal = 0;
12736 }
12737
12738 // use float as more appropriate for negative values and percent applying
12739 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12740 // apply spellmod to Done amount
12741
12742 if (Player* modOwner = GetSpellModOwner())
12743 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12744
12745 return uint32(std::max(heal, 0.0f));
12746}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12882
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:12543

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), and sSpellMgr.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12749{
12750 float TakenTotalMod = 1.0f;
12751 float minval = 0.0f;
12752
12753 // Healing taken percent
12754 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12755 {
12757 }
12758
12759 if (minval)
12760 AddPct(TakenTotalMod, minval);
12761
12763 if (maxval)
12764 AddPct(TakenTotalMod, maxval);
12765
12766 // Tenacity increase healing % taken
12767 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12768 AddPct(TakenTotalMod, Tenacity->GetAmount());
12769
12770 // Healing Done
12771 int32 TakenTotal = 0;
12772
12773 // Taken fixed damage bonus auras
12774 int32 TakenAdvertisedBenefit = GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_HEALING, spellProto->GetSchoolMask());
12775
12776 // Nourish cast, glyph of nourish
12777 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12778 {
12779 bool any = false;
12780 bool hasglyph = caster->GetAuraEffectDummy(62971);
12782 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12783 {
12784 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12785 {
12786 SpellInfo const* spell = (*i)->GetSpellInfo();
12787 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12788 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12789 {
12790 TakenTotalMod *= 1.2f;
12791 any = true;
12792 }
12793
12794 if (hasglyph)
12795 TakenTotalMod += 0.06f;
12796 }
12797 }
12798 }
12799
12800 if (damagetype == DOT)
12801 {
12802 // Healing over time taken percent
12803 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12804 if (minval_hot)
12805 AddPct(TakenTotalMod, minval_hot);
12806
12807 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12808 if (maxval_hot)
12809 AddPct(TakenTotalMod, maxval_hot);
12810 }
12811
12812 // Check for table values
12813 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12814 float coeff = 0;
12815 float factorMod = 1.0f;
12816 if (bonus)
12817 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12818 else
12819 {
12820 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12821 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12822 {
12823 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12824 return healamount;
12825 }
12826 }
12827
12828 // Default calculation
12829 if (TakenAdvertisedBenefit)
12830 {
12831 float TakenCoeff = 0.0f;
12832 if (coeff <= 0)
12833 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12834
12835 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12836 if (Player* modOwner = GetSpellModOwner())
12837 {
12838 coeff *= 100.0f;
12839 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12840 coeff /= 100.0f;
12841 }
12842
12843 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12844 }
12845
12846 if (caster)
12847 {
12848 TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_RECEIVED, [caster, spellProto](AuraEffect const* aurEff)
12849 {
12850 return caster->GetGUID() == aurEff->GetCasterGUID() && aurEff->IsAffectedOnSpell(spellProto);
12851 });
12852 }
12853
12854 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12855 {
12856 switch (spellProto->Effects[i].ApplyAuraName)
12857 {
12858 // Bonus healing does not apply to these spells
12861 TakenTotal = 0;
12862 break;
12863 default:
12864 break;
12865 }
12866 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12867 TakenTotal = 0;
12868 }
12869
12870 // No positive taken bonus, custom attr
12871 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12872 {
12873 TakenTotal = 0;
12874 TakenTotalMod = 1.0f;
12875 }
12876
12877 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12878
12879 return uint32(std::max(heal, 0.0f));
12880}
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition SharedDefines.h:642
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition SpellAuraDefines.h:322
@ SPELL_AURA_MOD_HEALING
Definition SpellAuraDefines.h:178

References AddPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), AuraEffect::GetCasterGUID(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplier(), SpellInfo::HasAttribute(), flag96::HasFlag(), SpellInfo::Id, AuraEffect::IsAffectedOnSpell(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_MOD_HEALING, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HEALING_RECEIVED, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), spell_pal_lay_on_hands::HandleMaxHealthHeal(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3572{
3573 SpellInfo const* spellInfo = spell->GetSpellInfo();
3574
3575 // Check for immune
3576 if (victim->IsImmunedToSpell(spellInfo, spell))
3577 {
3578 return SPELL_MISS_IMMUNE;
3579 }
3580
3581 // All positive spells can`t miss
3583 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3584 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3585 {
3586 return SPELL_MISS_NONE;
3587 }
3588
3589 // Check for immune
3590 // xinef: check for school immunity only
3591 if (victim->IsImmunedToSchool(spell))
3592 {
3593 return SPELL_MISS_IMMUNE;
3594 }
3595
3596 if (this == victim)
3597 {
3598 return SPELL_MISS_NONE;
3599 }
3600
3601 // Return evade for units in evade mode
3602 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3604 {
3605 return SPELL_MISS_EVADE;
3606 }
3607
3608 // Try victim reflect spell
3609 if (CanReflect)
3610 {
3611 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3613
3614 if (reflectchance > 0 && roll_chance_i(reflectchance))
3615 {
3616 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3617 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3618 return SPELL_MISS_REFLECT;
3619 }
3620 }
3621
3622 switch (spellInfo->DmgClass)
3623 {
3626 return MeleeSpellHitResult(victim, spellInfo);
3628 {
3629 if (spellInfo->SpellFamilyName)
3630 {
3631 return SPELL_MISS_NONE;
3632 }
3633
3634 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3635 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3636 {
3637 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3638 {
3639 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3640 {
3641 return SPELL_MISS_NONE;
3642 }
3643 }
3644 }
3645 [[fallthrough]];
3646 }
3648 return MagicSpellHitResult(victim, spellInfo);
3649 }
3650
3651 return SPELL_MISS_NONE;
3652}
@ SPELL_EFFECT_DISPEL
Definition SharedDefines.h:827
@ SPELL_MISS_IMMUNE
Definition SharedDefines.h:1537
@ SPELL_MISS_EVADE
Definition SharedDefines.h:1536
@ SPELL_MISS_REFLECT
Definition SharedDefines.h:1541
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3365
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3192

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellInfo(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3509{
3510 // Check for immune
3511 if (victim->IsImmunedToSpell(spell))
3512 return SPELL_MISS_IMMUNE;
3513
3514 // All positive spells can`t miss
3516 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3517 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3518 return SPELL_MISS_NONE;
3519
3520 // Check for immune
3521 // xinef: check for school immunity only
3522 if (victim->IsImmunedToSchool(spell))
3523 return SPELL_MISS_IMMUNE;
3524
3525 if (this == victim)
3526 return SPELL_MISS_NONE;
3527
3528 // Return evade for units in evade mode
3529 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3530 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3531 return SPELL_MISS_EVADE;
3532
3533 // Try victim reflect spell
3534 if (CanReflect)
3535 {
3536 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3537 reflectchance += victim->GetTotalAuraModifierByMiscMask(SPELL_AURA_REFLECT_SPELLS_SCHOOL, spell->GetSchoolMask());
3538
3539 if (reflectchance > 0 && roll_chance_i(reflectchance))
3540 {
3541 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3542 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3543 return SPELL_MISS_REFLECT;
3544 }
3545 }
3546
3547 switch (spell->DmgClass)
3548 {
3551 return MeleeSpellHitResult(victim, spell);
3553 {
3554 if (spell->SpellFamilyName)
3555 {
3556 return SPELL_MISS_NONE;
3557 }
3558 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3559 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3560 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3561 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3562 return SPELL_MISS_NONE;
3563 [[fallthrough]];
3564 }
3566 return MagicSpellHitResult(victim, spell);
3567 }
3568 return SPELL_MISS_NONE;
3569}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

Referenced by Spell::AddUnitTarget(), DealDamageShieldDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11490{
11491 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11492 return 1.0f;
11493
11494 // Some spells don't benefit from done mods
11495 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11496 return 1.0f;
11497
11498 // For totems get damage bonus from owner
11499 if (IsCreature())
11500 {
11501 if (IsTotem())
11502 {
11503 if (Unit* owner = GetOwner())
11504 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11505 }
11506 // Dancing Rune Weapon...
11507 else if (GetEntry() == 27893)
11508 {
11509 if (Unit* owner = GetOwner())
11510 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11511 }
11512 }
11513
11514 // Done total percent damage auras
11515 float DoneTotalMod = 1.0f;
11516
11517 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, [spellProto, this, damagetype](AuraEffect const* aurEff)
11518 {
11519 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11520 if (spellProto->EquippedItemClass == -1 && aurEff->GetSpellInfo()->EquippedItemClass != -1 &&
11522 {
11523 return false;
11524 }
11525
11526 if (!spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, damagetype == DOT))
11527 return false;
11528
11529 if (aurEff->GetMiscValue() & spellProto->GetSchoolMask())
11530 {
11531 if (aurEff->GetSpellInfo()->EquippedItemClass == -1)
11532 return true;
11534 return true;
11535 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements(aurEff->GetSpellInfo()))
11536 return true;
11537 }
11538 return false;
11539 });
11540
11541 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11542 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, [creatureTypeMask, spellProto, damagetype, this](AuraEffect const* aurEff)
11543 {
11544 return creatureTypeMask & aurEff->GetMiscValue() && spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, damagetype == DOT);
11545 });
11546
11547 // bonus against aurastate
11548 DoneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, [victim, spellProto, damagetype, this](AuraEffect const* aurEff)
11549 {
11550 return victim->HasAuraState(AuraStateType(aurEff->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, aurEff, damagetype == DOT);
11551 });
11552
11553 // done scripted mod (take it from owner)
11554 Unit* owner = GetOwner() ? GetOwner() : this;
11555 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11556 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11557 {
11558 // Xinef: self cast is ommited (because of Rage of Rivendare)
11559 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11560 continue;
11561
11562 // xinef: Molten Fury should work on all spells
11563 switch ((*i)->GetMiscValue())
11564 {
11565 case 4920: // Molten Fury
11566 case 4919:
11567 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11568 AddPct(DoneTotalMod, (*i)->GetAmount());
11569 break;
11570 }
11571
11572 if (!(*i)->IsAffectedOnSpell(spellProto))
11573 continue;
11574
11575 switch ((*i)->GetMiscValue())
11576 {
11577 case 6917: // Death's Embrace
11578 case 6926:
11579 case 6928:
11580 {
11581 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11582 AddPct(DoneTotalMod, (*i)->GetAmount());
11583 break;
11584 }
11585 // Soul Siphon
11586 case 4992:
11587 case 4993:
11588 {
11589 // effect 1 m_amount
11590 int32 maxPercent = (*i)->GetAmount();
11591 // effect 0 m_amount
11592 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11593 // count affliction effects and calc additional damage in percentage
11594 int32 modPercent = 0;
11595 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11596 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11597 {
11598 Aura const* aura = itr->second->GetBase();
11599 SpellInfo const* m_spell = aura->GetSpellInfo();
11600 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11601 continue;
11602 modPercent += stepPercent * aura->GetStackAmount();
11603 if (modPercent >= maxPercent)
11604 {
11605 modPercent = maxPercent;
11606 break;
11607 }
11608 }
11609 AddPct(DoneTotalMod, modPercent);
11610 break;
11611 }
11612 case 6916: // Death's Embrace
11613 case 6925:
11614 case 6927:
11615 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11616 AddPct(DoneTotalMod, (*i)->GetAmount());
11617 break;
11618 case 5481: // Starfire Bonus
11619 {
11620 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11621 AddPct(DoneTotalMod, (*i)->GetAmount());
11622 break;
11623 }
11624 // Tundra Stalker
11625 // Merciless Combat
11626 case 7277:
11627 {
11628 // Merciless Combat
11629 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11630 {
11631 if ((spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11632 if (!victim->HealthAbovePct(35))
11633 AddPct(DoneTotalMod, (*i)->GetAmount());
11634 }
11635 // Tundra Stalker
11636 else
11637 {
11638 // Frost Fever (target debuff)
11639 if (victim->HasAura(55095))
11640 AddPct(DoneTotalMod, (*i)->GetAmount());
11641 break;
11642 }
11643 break;
11644 }
11645 // Rage of Rivendare
11646 case 7293:
11647 {
11649 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11650 break;
11651 }
11652 // Twisted Faith
11653 case 7377:
11654 {
11656 AddPct(DoneTotalMod, (*i)->GetAmount());
11657 break;
11658 }
11659 // Marked for Death
11660 case 7598:
11661 case 7599:
11662 case 7600:
11663 case 7601:
11664 case 7602:
11665 {
11666 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11667 AddPct(DoneTotalMod, (*i)->GetAmount());
11668 break;
11669 }
11670 // Dirty Deeds
11671 case 6427:
11672 case 6428:
11673 case 6579:
11674 case 6580:
11675 {
11676 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11677 {
11678 // effect 0 has expected value but in negative state
11679 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11680 AddPct(DoneTotalMod, bonus);
11681 }
11682 break;
11683 }
11684 }
11685 }
11686
11687 // Custom scripted damage
11688 switch (spellProto->SpellFamilyName)
11689 {
11690 case SPELLFAMILY_MAGE:
11691 // Ice Lance
11692 if (spellProto->SpellIconID == 186)
11693 {
11694 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11695 {
11696 // Glyph of Ice Lance
11697 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11698 DoneTotalMod *= 4.0f;
11699 else
11700 DoneTotalMod *= 3.0f;
11701 }
11702 }
11703
11704 // Torment the weak
11705 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11706 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11708 AddPct(DoneTotalMod, aurEff->GetAmount());
11709 break;
11710 case SPELLFAMILY_PRIEST:
11711 // Mind Flay
11712 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11713 {
11714 // Glyph of Shadow Word: Pain
11715 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11716 // Increase Mind Flay damage if Shadow Word: Pain present on target
11718 AddPct(DoneTotalMod, aurEff->GetAmount());
11719
11720 // Twisted Faith - Mind Flay part
11722 // Increase Mind Flay damage if Shadow Word: Pain present on target
11724 AddPct(DoneTotalMod, aurEff->GetAmount());
11725 }
11726 // Smite
11727 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11728 {
11729 // Glyph of Smite
11730 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11731 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11732 AddPct(DoneTotalMod, aurEff->GetAmount());
11733 }
11734 // Shadow Word: Death
11735 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11736 {
11737 // Glyph of Shadow Word: Death
11738 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11740 AddPct(DoneTotalMod, aurEff->GetAmount());
11741 }
11742
11743 break;
11745 // Judgement of Vengeance/Judgement of Corruption
11746 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11747 {
11748 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11749 uint32 stacks = 0;
11751 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11752 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11753 {
11754 stacks = (*itr)->GetBase()->GetStackAmount();
11755 break;
11756 }
11757 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11758 if (stacks)
11759 AddPct(DoneTotalMod, 10 * stacks);
11760 }
11761 break;
11762 case SPELLFAMILY_DRUID:
11763 // Thorns
11764 if (spellProto->SpellFamilyFlags[0] & 0x100)
11765 {
11766 // Brambles
11767 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11768 AddPct(DoneTotalMod, aurEff->GetAmount());
11769 }
11770 break;
11772 // Fire and Brimstone
11773 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11775 {
11777 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11778 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11779 {
11780 AddPct(DoneTotalMod, (*i)->GetAmount());
11781 break;
11782 }
11783 }
11784 // Drain Soul - increased damage for targets under 25 % HP
11785 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11786 if (!victim->HealthAbovePct(25))
11787 DoneTotalMod *= 4;
11788 // Shadow Bite (15% increase from each dot)
11789 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11790 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11791 AddPct(DoneTotalMod, 15 * count);
11792 break;
11793 case SPELLFAMILY_HUNTER:
11794 // Steady Shot
11795 if (spellProto->SpellFamilyFlags[1] & 0x1)
11796 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11797 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11798 AddPct(DoneTotalMod, aurEff->GetAmount());
11799 break;
11801 // Improved Icy Touch
11802 if (spellProto->SpellFamilyFlags[0] & 0x2)
11804 AddPct(DoneTotalMod, aurEff->GetAmount());
11805
11806 // Glacier Rot
11807 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11809 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11810 AddPct(DoneTotalMod, aurEff->GetAmount());
11811 break;
11812 }
11813
11814 return DoneTotalMod;
11815}
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM
Definition SharedDefines.h:594
@ MECHANIC_SLOW_ATTACK
Definition SharedDefines.h:1344
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition SharedDefines.h:1304
@ AURA_STATE_CONFLAGRATE
Definition SharedDefines.h:1317
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition Unit.cpp:5963
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition Unit.cpp:5934
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition Unit.cpp:6017

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, AuraEffect::GetAmount(), GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetLevel(), AuraEffect::GetMiscValue(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetTotalAuraMultiplier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), Object::IsCreature(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12544{
12545 // For totems get healing bonus from owner (statue isn't totem in fact)
12546 if (IsCreature() && IsTotem())
12547 if (Unit* owner = GetOwner())
12548 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12549
12550 // Some spells don't benefit from done mods
12551 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12552 return 1.0f;
12553
12554 // xinef: Some spells don't benefit from done mods
12555 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12556 return 1.0f;
12557
12558 // No bonus healing for potion spells
12559 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12560 return 1.0f;
12561
12562 float DoneTotalMod = 1.0f;
12563
12564 // Healing done percent
12566
12567 // done scripted mod (take it from owner)
12568 Unit* owner = GetOwner() ? GetOwner() : this;
12569 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12570 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12571 {
12572 if (!(*i)->IsAffectedOnSpell(spellProto))
12573 continue;
12574
12575 switch ((*i)->GetMiscValue())
12576 {
12577 case 21: // Test of Faith
12578 case 6935:
12579 case 6918:
12580 if (victim->HealthBelowPct(50))
12581 AddPct(DoneTotalMod, (*i)->GetAmount());
12582 break;
12583 case 7798: // Glyph of Regrowth
12584 {
12586 AddPct(DoneTotalMod, (*i)->GetAmount());
12587 break;
12588 }
12589
12590 case 7871: // Glyph of Lesser Healing Wave
12591 {
12592 // xinef: affected by any earth shield
12593 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12594 AddPct(DoneTotalMod, (*i)->GetAmount());
12595 break;
12596 }
12597 default:
12598 break;
12599 }
12600 }
12601
12602 switch (spellProto->SpellFamilyName)
12603 {
12605 // Talents and glyphs for healing stream totem
12606 if (spellProto->Id == 52042)
12607 {
12608 // Glyph of Healing Stream Totem
12609 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12610 AddPct(DoneTotalMod, dummy->GetAmount());
12611
12612 // Healing Stream totem - Restorative Totems
12613 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12614 AddPct(DoneTotalMod, aurEff->GetAmount());
12615 }
12616 break;
12617 case SPELLFAMILY_PRIEST:
12618 // T9 HEALING 4P, empowered renew instant heal
12619 if (spellProto->Id == 63544)
12620 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12621 AddPct(DoneTotalMod, aurEff->GetAmount());
12622 break;
12623 }
12624
12625 return DoneTotalMod;
12626}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), GetTotalAuraMultiplier(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, Object::IsCreature(), IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
12257{
12258 // not critting spell
12259 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12260 return 0.0f;
12261
12262 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12263 if (!skipEffectCheck && !spellProto->IsCritCapable())
12264 return 0.0f;
12265
12266 float crit_chance = doneChance;
12267 switch (spellProto->DmgClass)
12268 {
12270 {
12271 if (!spellProto->IsPositive())
12272 {
12273 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12274 // xinef: apply max and min only
12276 {
12279 }
12280
12281 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12282 }
12283 // scripted (increase crit chance ... against ... target by x%
12284 if (caster)
12285 {
12286 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12287 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12288 {
12289 if (!((*i)->IsAffectedOnSpell(spellProto)))
12290 continue;
12291 int32 modChance = 0;
12292 switch ((*i)->GetMiscValue())
12293 {
12294 // Shatter
12295 case 911:
12296 modChance += 16;
12297 [[fallthrough]];
12298 case 910:
12299 modChance += 17;
12300 [[fallthrough]];
12301 case 849:
12302 modChance += 17;
12303 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12304 break;
12305 crit_chance += modChance;
12306 break;
12307 case 7917: // Glyph of Shadowburn
12308 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12309 crit_chance += (*i)->GetAmount();
12310 break;
12311 case 7997: // Renewed Hope
12312 case 7998:
12313 if (HasAura(6788))
12314 crit_chance += (*i)->GetAmount();
12315 break;
12316 default:
12317 break;
12318 }
12319 }
12320 // Custom crit by class
12321 switch (spellProto->SpellFamilyName)
12322 {
12323 case SPELLFAMILY_MAGE:
12324 // Glyph of Fire Blast
12325 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12327 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12328 crit_chance += aurEff->GetAmount();
12329 break;
12330 case SPELLFAMILY_DRUID:
12331 // Improved Faerie Fire
12333 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12334 crit_chance += aurEff->GetAmount();
12335
12336 // cumulative effect - don't break
12337
12338 // Starfire
12339 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12340 {
12341 // Improved Insect Swarm
12342 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12344 crit_chance += aurEff->GetAmount();
12345 break;
12346 }
12347 break;
12348 case SPELLFAMILY_ROGUE:
12349 // Shiv-applied poisons can't crit
12350 if (caster->FindCurrentSpellBySpellId(5938))
12351 crit_chance = 0.0f;
12352 break;
12354 // Flash of light
12355 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12356 {
12357 // Sacred Shield
12358 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12359 crit_chance += aura->GetAmount();
12360 break;
12361 }
12362 // Exorcism
12363 else if (spellProto->GetCategory() == 19)
12364 {
12366 return 100.0f;
12367 break;
12368 }
12369 break;
12370 case SPELLFAMILY_SHAMAN:
12371 // Lava Burst
12372 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12373 {
12374 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12376 return 100.0f;
12377 break;
12378 }
12379 break;
12380 }
12381 }
12382 break;
12383 }
12385 // Custom crit by class
12386 if (caster)
12387 {
12388 switch (spellProto->SpellFamilyName)
12389 {
12390 case SPELLFAMILY_DRUID:
12391 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12392 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12393 {
12394 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12395 crit_chance += rendAndTear->GetAmount();
12396 break;
12397 }
12398 break;
12400 // Victory Rush
12401 if (spellProto->SpellFamilyFlags[1] & 0x100)
12402 {
12403 // Glyph of Victory Rush
12404 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12405 crit_chance += aurEff->GetAmount();
12406 break;
12407 }
12408 break;
12409 }
12410 }
12411
12412 // 100% critical chance against sitting target
12414 {
12415 return 100.0f;
12416 }
12417 [[fallthrough]];
12419 {
12420 // flat aura mods
12421 if (attackType == RANGED_ATTACK)
12423 else
12425
12426 // reduce crit chance from Rating for players
12427 if (attackType != RANGED_ATTACK)
12428 {
12429 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12430 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12431 }
12432 else
12433 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12434
12435 // Apply crit chance from defence skill
12436 if (caster)
12437 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12438
12439 break;
12440 }
12441 // values overridden in spellmgr for lifebloom and earth shield
12443 default:
12444 return 0.0f;
12445 }
12446
12447 if (caster)
12448 {
12449 crit_chance += GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, [caster](AuraEffect const* aurEff)
12450 {
12451 return caster->GetGUID() == aurEff->GetCasterGUID();
12452 });
12453 }
12454
12455 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12456 // xinef: should be calculated at the end
12457 if (!spellProto->IsPositive())
12459
12460 // xinef: can be negative!
12461 return crit_chance;
12462}
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition SharedDefines.h:2654
@ MECHANIC_KNOCKOUT
Definition SharedDefines.h:1350
@ AURA_STATE_BLEEDING
Definition SharedDefines.h:1321
@ AURA_STATE_FAERIE_FIRE
Definition SharedDefines.h:1315
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition Unit.cpp:6166
bool HasAttackerSpellCritChanceAura() const
Definition Unit.h:1812
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6176

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetCasterGUID(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), HasAttackerSpellCritChanceAura(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition Unit.h:604

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
20145{
20146 if (Unit* victim = GetVictim())
20147 {
20148 if (victim->GetFactionTemplateEntry()->faction == faction_id)
20149 {
20150 AttackStop();
20151 if (IsNonMeleeSpellCast(false))
20153
20154 // melee and ranged forced attack cancel
20155 if (IsPlayer())
20157 }
20158 }
20159
20160 AttackerSet const& attackers = getAttackers();
20161 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20162 {
20163 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20164 {
20165 (*itr)->AttackStop();
20166 itr = attackers.begin();
20167 }
20168 else
20169 ++itr;
20170 }
20171
20173
20174 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20175 (*itr)->StopAttackFaction(faction_id);
20176}
void deleteReferencesForFaction(uint32 faction)
Definition HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20179{
20180 AttackerSet const& attackers = getAttackers();
20181 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20182 {
20183 Unit* attacker = (*itr);
20184 if (!attacker->IsValidAttackTarget(this))
20185 {
20186 attacker->AttackStop();
20187 if (attacker->IsPlayer())
20188 {
20190 }
20191
20192 for (Unit* controlled : attacker->m_Controlled)
20193 {
20194 if (controlled->GetVictim() == this && !controlled->IsValidAttackTarget(this))
20195 {
20196 controlled->AttackStop();
20197 }
20198 }
20199
20200 itr = attackers.begin();
20201 }
20202 else
20203 {
20204 ++itr;
20205 }
20206 }
20207}

References AttackStop(), getAttackers(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16867{
16869
16870 // not need send any packets if not in world or not moving
16871 if (!IsInWorld())
16872 return;
16873
16874 if (movespline->Finalized())
16875 return;
16876
16877 // Update position now since Stop does not start a new movement that can be updated later
16878 if (movespline->HasStarted())
16880
16881 Movement::MoveSplineInit init(this);
16882 init.Stop();
16883}
bool HasStarted() const
Definition MoveSpline.h:130
void UpdateSplinePosition()
Definition Unit.cpp:608

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_alar::ConstructWaypointsAndMove(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::boss_kologarnAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), boss_janalai::JustEngagedWith(), Player::LeaveBattleground(), boss_headless_horseman::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), boss_felblood_kaelthas::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SendMoveRoot(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_magister_aledis::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16906{
16908
16909 // not need send any packets if not in world
16910 if (!IsInWorld())
16911 return;
16912
16913 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16914 Movement::MoveSplineInit init(this);
16915 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16916 init.SetFacing(GetOrientation());
16917 init.Launch();
16918}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), boss_alar::DoDiveBomb(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_janalai::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), and npc_vortex_ride::npc_vortex_rideAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
21224{
21225 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
21228 Cell::VisitObjects(this, worker, textRange);
21229}
Definition ChatTextBuilder.h:49
Definition GridNotifiers.h:1737
Definition GridNotifiers.h:583

References Cell::VisitObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21276{
21277 if (!sObjectMgr->GetBroadcastText(textId))
21278 {
21279 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21280 return;
21281 }
21282
21283 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21286 Cell::VisitObjects(this, worker, textRange);
21287}
Definition ChatTextBuilder.h:31
uint8 getGender() const
Definition Unit.h:838

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14770{
14771 ASSERT(IsCreature());
14772
14773 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14774 return;
14775
14776 if (!CanHaveThreatList())
14777 return;
14778
14779 Creature* creature = ToCreature();
14780
14781 if (creature->HasReactState(REACT_PASSIVE))
14782 return;
14783
14784 Unit* target = GetVictim();
14785 if (target && target == taunter)
14786 return;
14787
14788 SetInFront(taunter);
14789 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14790
14791 if (creature->IsAIEnabled)
14792 creature->AI()->AttackStart(taunter);
14793
14794 //m_ThreatMgr.tauntApply(taunter);
14795}
void SetInFront(WorldObject const *target)
Definition Unit.cpp:20490

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14800{
14801 ASSERT(IsCreature());
14802
14803 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14804 return;
14805
14806 if (!CanHaveThreatList())
14807 return;
14808
14809 Creature* creature = ToCreature();
14810
14811 if (creature->HasReactState(REACT_PASSIVE))
14812 return;
14813
14814 Unit* target = GetVictim();
14815 if (!target || target != taunter)
14816 return;
14817
14819 {
14820 if (creature->IsAIEnabled)
14822 return;
14823 }
14824
14825 target = creature->SelectVictim(); // might have more taunt auras remaining
14826
14827 if (target && target != taunter)
14828 {
14830 SetInFront(target);
14831 if (creature->IsAIEnabled)
14832 creature->AI()->AttackStart(target);
14833 }
14834}
@ EVADE_REASON_NO_HOSTILES
Definition CreatureAI.h:90
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition CreatureAI.cpp:205
Unit * SelectVictim()
Definition Unit.cpp:14838
bool isThreatListEmpty() const
Definition ThreatMgr.h:224

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21300{
21301 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21302}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
721{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), CreatureAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_the_cleansing_on_death_cast_on_master::HandleScript(), spell_gen_whisper_to_controller::HandleScript(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), Creature::IsUpdateNeeded(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::JustSummoned(), npc_frosthound::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::npc_collapsing_starAI::JustSummoned(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::npc_freya_wardAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_jenny::UpdateFollowerAI(), Player::VehicleSpellInitialize(), and npc_frosthound::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
722{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
720{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16761{
16762 DamageInfo dmgInfo = DamageInfo(damageInfo);
16763 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16764}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition Unit.cpp:16760

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent(), and TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16786{
16787 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16788 {
16789 if (!(*itr)->GetRemoveMode())
16790 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16791 }
16792}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16767{
16768 // prepare data for self trigger
16769 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16770 std::list<AuraApplication*> myAurasTriggeringProc;
16771 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16772
16773 // prepare data for target trigger
16774 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16775 std::list<AuraApplication*> targetAurasTriggeringProc;
16776 if (typeMaskActionTarget)
16777 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16778
16779 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16780
16781 if (typeMaskActionTarget)
16782 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16783}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition Unit.cpp:16730

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11411{
11412 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11413 {
11414 if (!m_SummonSlot[i])
11415 {
11416 continue;
11417 }
11418
11419 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11420 {
11421 if (OldTotem->IsSummon())
11422 {
11423 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11424 {
11425 OldTotem->ToTempSummon()->UnSummon();
11426 }
11427 }
11428 }
11429 }
11430}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

384{
385 sScriptMgr->OnUnitUpdate(this, p_time);
386
387 // WARNING! Order of execution here is important, do not change.
388 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
389 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
390 WorldObject::Update(p_time);
391
392 if (!IsInWorld())
393 return;
394
395 // pussywizard:
396 if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
397 {
399 {
401 {
403 //ExecuteDelayedUnitRelocationEvent();
405 }
406 else
408 }
410 {
411 if (m_delayed_unit_ai_notify_timer <= p_time)
412 {
415 }
416 else
418 }
419 }
420
421 _UpdateSpells( p_time );
422
423 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
425
426 // update combat timer only for players and pets (only pets with PetAI)
428 {
429 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
430 // targets without stopping half way there and running off.
431 // These flags are reset after target dies or another command is given.
433 {
434 // m_CombatTimer set at aura start and it will be freeze until aura removing
435 if (m_CombatTimer <= p_time)
437 else
438 m_CombatTimer -= p_time;
439 }
440 }
441
444 {
445 while (!extraAttacksTargets.empty())
446 {
447 auto itr = extraAttacksTargets.begin();
448 ObjectGuid targetGuid = itr->first;
449 uint32 count = itr->second;
450 extraAttacksTargets.erase(itr);
451 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
452 {
454 || victim->IsWithinMeleeRange(this))
455 {
456 HandleProcExtraAttackFor(victim, count);
457 }
458 }
459 }
461 }
462
463 // not implemented before 3.0.2
464 // xinef: if attack time > 0, reduce by diff
465 // if on next update, attack time < 0 assume player didnt attack - set to 0
466 bool suspendAttackTimer = false;
467 bool suspendRangedAttackTimer = false;
469 {
470 for (Spell* spell : m_currentSpells)
471 {
472 if (spell)
473 {
474 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
475 {
476 if (spell->IsChannelActive())
477 {
478 suspendRangedAttackTimer = true;
479 }
480
481 suspendAttackTimer = true;
482 break;
483 }
484 }
485 }
486 }
487
488 if (!suspendAttackTimer)
489 {
490 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
491 {
492 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
493 }
494
495 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
496 {
497 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
498 }
499 }
500
501 if (!suspendRangedAttackTimer)
502 {
503 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
504 {
505 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
506 }
507 }
508
509 // update abilities available only for fraction of time
510 UpdateReactives(p_time);
511
515
516 UpdateSplineMovement(p_time);
517 GetMotionMaster()->UpdateMotion(p_time);
518
520}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition SharedDefines.h:1326
bool IsEmpty() const
Definition LinkedList.h:97
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition Map.h:236
void UpdateMotion(uint32 diff)
Definition MotionMaster.cpp:105
void _UpdateSpells(uint32 time)
Definition Unit.cpp:3869
void UpdateSplineMovement(uint32 t_diff)
Definition Unit.cpp:576
void UpdateReactives(uint32 p_time)
Definition Unit.cpp:17172
void ExecuteDelayedUnitAINotifyEvent()
Definition Unit.cpp:20479
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition Unit.cpp:2796
void SendThreatListUpdate()
Definition Unit.cpp:20053
virtual void Update(uint32 diff)
Definition Object.cpp:1044

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_STATE_CASTING, WorldObject::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllDamageDoneMods()

void Unit::UpdateAllDamageDoneMods ( )
15497{
15498 for (uint8 i = BASE_ATTACK; i < MAX_ATTACK; ++i)
15500}
virtual void UpdateDamageDoneMods(WeaponAttackType attackType, int32 skipEnchantSlot=-1)
Definition Unit.cpp:15466

References BASE_ATTACK, MAX_ATTACK, and UpdateDamageDoneMods().

Referenced by AuraEffect::HandleModDamageDone().

◆ UpdateAllDamagePctDoneMods()

void Unit::UpdateAllDamagePctDoneMods ( )
15541{
15542 for (uint8 i = BASE_ATTACK; i < MAX_ATTACK; ++i)
15544}
void UpdateDamagePctDoneMods(WeaponAttackType attackType)
Definition Unit.cpp:15502

References BASE_ATTACK, MAX_ATTACK, and UpdateDamagePctDoneMods().

Referenced by AuraEffect::HandleModDamagePercentDone().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by UpdateUnitMod().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17414{
17415 if (slot >= MAX_AURAS) // slot not found, return
17416 return;
17417 if (Player* player = ToPlayer())
17418 {
17419 if (player->GetGroup())
17420 {
17421 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17422 player->SetAuraUpdateMaskForRaid(slot);
17423 }
17424 }
17425 else if (IsCreature() && IsPet())
17426 {
17427 Pet* pet = ((Pet*)this);
17428 if (pet->isControlled())
17429 {
17430 Unit* owner = GetOwner();
17431 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17432 {
17434 pet->SetAuraUpdateMaskForRaid(slot);
17435 }
17436 }
17437 }
17438}
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition Group.h:109
#define MAX_AURAS
Definition SpellAuraDefines.h:21
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition Pet.h:137

References Player::GetGroup(), GetOwner(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), and Object::ToPlayer().

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
16006{
16007 if (IsPlayer())
16008 return;
16009
16010 if (i_disabledAI) // disabled AI must be primary AI
16011 {
16012 if (!IsCharmed())
16013 {
16014 delete i_AI;
16016 i_disabledAI = nullptr;
16017 }
16018 }
16019 else
16020 {
16021 if (IsCharmed())
16022 {
16024 if (isPossessed() || IsVehicle())
16025 i_AI = new PossessedAI(ToCreature());
16026 else
16027 i_AI = new PetAI(ToCreature());
16028 }
16029 }
16030}
Definition PetAI.h:47
Definition PassiveAI.h:37

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

Referenced by Creature::Update().

◆ UpdateDamageDoneMods()

void Unit::UpdateDamageDoneMods ( WeaponAttackType  attackType,
int32  skipEnchantSlot = -1 
)
virtual

Reimplemented in Player.

15467{
15468 UnitMods unitMod;
15469 switch (attackType)
15470 {
15471 case BASE_ATTACK:
15472 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
15473 break;
15474 case OFF_ATTACK:
15475 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
15476 break;
15477 case RANGED_ATTACK:
15478 unitMod = UNIT_MOD_DAMAGE_RANGED;
15479 break;
15480 default:
15481 ABORT();
15482 break;
15483 }
15484
15485 float amount = GetTotalAuraModifier(SPELL_AURA_MOD_DAMAGE_DONE, [&](AuraEffect const* aurEff) -> bool
15486 {
15487 if (!(aurEff->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL))
15488 return false;
15489
15490 return CheckAttackFitToAuraRequirement(attackType, aurEff);
15491 });
15492
15493 SetStatFlatModifier(unitMod, TOTAL_VALUE, amount);
15494}
@ UNIT_MOD_DAMAGE_RANGED
Definition Unit.h:174
@ UNIT_MOD_DAMAGE_MAINHAND
Definition Unit.h:172
virtual bool CheckAttackFitToAuraRequirement(WeaponAttackType, AuraEffect const *) const
Definition Unit.h:1072
void SetStatFlatModifier(UnitMods unitMod, UnitModifierFlatType modifierType, float val)
Definition Unit.cpp:15363

References ABORT, BASE_ATTACK, CheckAttackFitToAuraRequirement(), AuraEffect::GetMiscValue(), GetTotalAuraModifier(), OFF_ATTACK, RANGED_ATTACK, SetStatFlatModifier(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_SCHOOL_MASK_NORMAL, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, and UNIT_MOD_DAMAGE_RANGED.

Referenced by UpdateAllDamageDoneMods(), and Player::UpdateDamageDoneMods().

◆ UpdateDamagePctDoneMods()

void Unit::UpdateDamagePctDoneMods ( WeaponAttackType  attackType)
15503{
15504 float factor;
15505 UnitMods unitMod;
15506 switch (attackType)
15507 {
15508 case BASE_ATTACK:
15509 factor = 1.0f;
15510 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
15511 break;
15512 case OFF_ATTACK:
15513 // off hand has 50% penalty
15514 factor = 0.5f;
15515 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
15516 break;
15517 case RANGED_ATTACK:
15518 factor = 1.0f;
15519 unitMod = UNIT_MOD_DAMAGE_RANGED;
15520 break;
15521 default:
15522 ABORT();
15523 break;
15524 }
15525
15526 factor *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, [attackType, this](AuraEffect const* aurEff) -> bool
15527 {
15528 if (!(aurEff->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL))
15529 return false;
15530
15531 return CheckAttackFitToAuraRequirement(attackType, aurEff);
15532 });
15533
15534 if (attackType == OFF_ATTACK)
15535 factor *= GetTotalAuraMultiplier(SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT, std::bind(&Unit::CheckAttackFitToAuraRequirement, this, attackType, std::placeholders::_1));
15536
15537 SetStatPctModifier(unitMod, TOTAL_PCT, factor);
15538}
@ SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT
Definition SpellAuraDefines.h:185
void SetStatPctModifier(UnitMods unitMod, UnitModifierPctType modifierType, float val)
Definition Unit.cpp:15372

References ABORT, BASE_ATTACK, CheckAttackFitToAuraRequirement(), AuraEffect::GetMiscValue(), GetTotalAuraMultiplier(), OFF_ATTACK, RANGED_ATTACK, SetStatPctModifier(), SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT, SPELL_SCHOOL_MASK_NORMAL, TOTAL_PCT, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, and UNIT_MOD_DAMAGE_RANGED.

Referenced by AuraEffect::HandleModOffhandDamagePercent(), UpdateAllDamagePctDoneMods(), and Player::UpdateWeaponDependentAuras().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition Object.cpp:779

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), ScriptedAI::SetEquipmentSlots(), Creature::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), and UpdateUnitMod().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

20047{
20049 if (IsVehicle())
20051}
void RelocatePassengers()
Definition Vehicle.cpp:516

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
769{
770 m_interruptMask = 0;
771 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
772 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
773
775 if (spell->getState() == SPELL_STATE_CASTING)
776 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
777}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by UpdateUnitMod().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by UpdateUnitMod().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

20039{
20040 SetOrientation(orientation);
20041 if (IsVehicle())
20043}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

20001{
20002 if (!Acore::IsValidMapCoord(x, y, z, orientation))
20003 return false;
20004
20005 float old_orientation = GetOrientation();
20006 float current_z = GetPositionZ();
20007 bool turn = (old_orientation != orientation);
20008 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
20009
20010 if (!GetVehicle())
20011 {
20012 uint32 mask = 0;
20013 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
20014 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
20015 if (mask)
20017 }
20018
20019 if (relocated)
20020 {
20021 if (IsPlayer())
20022 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
20023 else
20024 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
20025 }
20026 else if (turn)
20027 {
20028 UpdateOrientation(orientation);
20029
20030 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
20032 }
20033
20034 return (relocated || turn);
20035}
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition Map.cpp:784
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition Map.cpp:806
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition Unit.cpp:20038
bool IsValidMapCoord(float c)
Definition GridDefines.h:210

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by boss_taldaram::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMoverRelocation(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_escortAI::SetNextWaypoint(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
17173{
17174 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17175 {
17176 ReactiveType reactive = ReactiveType(i);
17177
17178 if (!m_reactiveTimer[reactive])
17179 continue;
17180
17181 if (m_reactiveTimer[reactive] <= p_time)
17182 {
17183 m_reactiveTimer[reactive] = 0;
17184
17185 switch (reactive)
17186 {
17187 case REACTIVE_DEFENSE:
17190 break;
17194 break;
17195 case REACTIVE_OVERPOWER:
17197 {
17199 }
17200 break;
17202 if (IsHunterPet())
17204 break;
17205 default:
17206 break;
17207 }
17208 }
17209 else
17210 {
17211 m_reactiveTimer[reactive] -= p_time;
17212 }
17213 }
17214}
ReactiveType
Definition Unit.h:607

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistanceBuffModsMod()

void Unit::UpdateResistanceBuffModsMod ( SpellSchools  school)
6267{
6268 float modPos = 0.0f;
6269 float modNeg = 0.0f;
6270
6271 // these auras are always positive
6273 modPos += GetTotalAuraModifier(SPELL_AURA_MOD_RESISTANCE, [school](AuraEffect const* aurEff) -> bool
6274 {
6275 if ((aurEff->GetMiscValue() & (1 << school)) && aurEff->GetAmount() > 0)
6276 return true;
6277 return false;
6278 });
6279
6280 modNeg = GetTotalAuraModifier(SPELL_AURA_MOD_RESISTANCE, [school](AuraEffect const* aurEff) -> bool
6281 {
6282 if ((aurEff->GetMiscValue() & (1 << school)) && aurEff->GetAmount() < 0)
6283 return true;
6284 return false;
6285 });
6286
6288 modPos *= factor;
6289 modNeg *= factor;
6290
6293}
@ SPELL_AURA_MOD_RESISTANCE
Definition SpellAuraDefines.h:85
@ SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE
Definition SpellAuraDefines.h:206
@ SPELL_AURA_MOD_RESISTANCE_PCT
Definition SpellAuraDefines.h:164

References AsUnderlyingType(), AuraEffect::GetAmount(), GetMaxPositiveAuraModifierByMiscMask(), AuraEffect::GetMiscValue(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), Object::SetFloatValue(), SPELL_AURA_MOD_RESISTANCE, SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE, SPELL_AURA_MOD_RESISTANCE_PCT, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), and AuraEffect::HandleModResistancePercent().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by UpdateAllResistances(), and UpdateUnitMod().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14415{
14416 int32 main_speed_mod = 0;
14417 float stack_bonus = 1.0f;
14418 float non_stack_bonus = 1.0f;
14419
14420 switch (mtype)
14421 {
14422 // Only apply debuffs
14423 case MOVE_FLIGHT_BACK:
14424 case MOVE_RUN_BACK:
14425 case MOVE_SWIM_BACK:
14426 case MOVE_WALK:
14427 break;
14428 case MOVE_RUN:
14429 {
14430 if (IsMounted()) // Use on mount auras
14431 {
14435 }
14436 else
14437 {
14441 }
14442 break;
14443 }
14444 case MOVE_SWIM:
14445 {
14446 // xinef: check for forced_speed_mod of sea turtle
14448 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14449 {
14450 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14451 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14452 {
14453 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14454 return;
14455 }
14456 else if (
14457 // case: increase speed
14458 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14459 // case: decrease speed
14460 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14461 )
14462 {
14463 main_speed_mod = (*itr)->GetAmount();
14464 }
14465 }
14466 break;
14467 }
14468 case MOVE_FLIGHT:
14469 {
14470 if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet
14471 {
14474
14475 // for some spells this mod is applied on vehicle owner
14476 int32 owner_speed_mod = 0;
14477
14478 if (Unit* owner = GetCharmer())
14479 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
14480
14481 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14482 }
14483 else if (IsMounted())
14484 {
14488 }
14489 else // Use not mount (shapeshift for example) auras (should stack)
14490 {
14494 }
14495
14496 // Update speed for vehicle if available
14497 if (IsPlayer() && GetVehicle())
14499 break;
14500 }
14501 default:
14502 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14503 return;
14504 }
14505
14506 // now we ready for speed calculation
14507 float speed = std::max(non_stack_bonus, stack_bonus);
14508 if (main_speed_mod)
14509 AddPct(speed, main_speed_mod);
14510
14511 switch (mtype)
14512 {
14513 case MOVE_RUN:
14514 case MOVE_SWIM:
14515 case MOVE_FLIGHT:
14516 {
14517 // Set creature speed rate
14518 if (IsCreature())
14519 {
14520 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14521 {
14522 // contant value for player pets
14523 speed *= 1.15f;
14524 }
14525 else
14526 {
14527 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14528 }
14529 }
14530
14531 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14534 {
14535 if (Creature* creature = ToCreature())
14536 {
14537 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14538 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14539 break;
14540 }
14541
14542 // Use speed from aura
14543 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14544 if (speed > max_speed)
14545 speed = max_speed;
14546 }
14547 break;
14548 }
14549 default:
14550 break;
14551 }
14552
14553 int32 slowFromHealth = 0;
14554 Creature* creature = ToCreature();
14555 // ignore pets, player owned vehicles, and mobs immune to snare
14556 if (creature
14557 && !IsPet()
14558 && !(IsControlledByPlayer() && IsVehicle())
14560 && !(creature->IsDungeonBoss()))
14561 {
14562 // 1.6% for each % under 30.
14563 // use min(0, health-30) so that we don't boost mobs above 30.
14564 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14565 }
14566
14567 if (slowFromHealth)
14568 {
14569 AddPct(speed, slowFromHealth);
14570 }
14571
14572 // Apply strongest slow aura mod to speed
14574 if (slow)
14575 AddPct(speed, slow);
14576
14577 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14578 {
14579 float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14580 float min_speed = base_speed * (minSpeedMod / 100.0f);
14581 if (speed < min_speed)
14582 speed = min_speed;
14583 }
14584
14585 SetSpeed(mtype, speed, forced);
14586}
@ MECHANIC_DAZE
Definition SharedDefines.h:1363
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition SpellAuraDefines.h:269
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition SpellAuraDefines.h:234
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING
Definition SpellAuraDefines.h:273
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition SpellAuraDefines.h:121
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition SpellAuraDefines.h:192
@ SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING
Definition SpellAuraDefines.h:274
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition SpellAuraDefines.h:193
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition SpellAuraDefines.h:254
@ MOVE_FLIGHT_BACK
Definition UnitDefines.h:360
@ MOVE_SWIM_BACK
Definition UnitDefines.h:357
@ MOVE_RUN_BACK
Definition UnitDefines.h:355
@ MOVE_WALK
Definition UnitDefines.h:353
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition Unit.cpp:14593
float speed_run
Definition CreatureData.h:201

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
577{
578 if (movespline->Finalized())
579 return;
580
581 // xinef: process movementinform
582 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
583 SplineHandler handler(this);
584 movespline->updateState(t_diff, handler);
585 // Xinef: Spline was cleared by StopMoving, return
586 if (!movespline->Initialized())
587 {
589 return;
590 }
591
592 bool arrived = movespline->Finalized();
593
594 if (arrived)
595 {
597
598 if (movespline->HasAnimation() && IsCreature() && IsAlive())
600 }
601
602 // pussywizard: update always! not every 400ms, because movement generators need the actual position
603 //m_movesplineTimer.Update(t_diff);
604 //if (m_movesplineTimer.Passed() || arrived)
606}
AnimTier
Definition MotionMaster.h:99
uint8 GetAnimationType() const
Definition MoveSpline.h:126
void updateState(int32 difftime, UpdateHandler &handler)
Definition MoveSpline.h:98
bool HasAnimation() const
Definition MoveSpline.h:125
Definition Unit.cpp:556
void SetAnimTier(AnimTier animTier)
Definition Unit.cpp:15287

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), Object::IsCreature(), movespline, SetAnimTier(), UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
609{
610 //static uint32 const positionUpdateDelay = 400;
611
612 //m_movesplineTimer.Reset(positionUpdateDelay);
614
616 {
618 pos.m_positionX = loc.x;
619 pos.m_positionY = loc.y;
620 pos.m_positionZ = loc.z;
622
623 if (TransportBase* transport = GetDirectTransport())
624 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
625 }
626
627 // Xinef: if we had spline running update orientation along with position
628 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
629 // loc.orientation = GetOrientation();
630
631 if (IsPlayer() || IsPet())
632 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
633 else
634 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
635}
void SetPosition(float x, float y, float z, float o)
Definition Creature.cpp:3168
Location ComputePosition() const
Definition MoveSpline.cpp:26
bool onTransport
Definition MoveSpline.h:128
Definition VehicleDefines.h:130
TransportBase * GetDirectTransport() const
Definition Unit.cpp:19014
Position pos
Definition Object.h:308
Definition MoveSpline.h:27
float orientation
Definition MoveSpline.h:33
float m_positionZ
Definition Position.h:57
float m_positionX
Definition Position.h:55
float m_positionY
Definition Position.h:56

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), IsPet(), Object::IsPlayer(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStatBuffMod()

void Unit::UpdateStatBuffMod ( Stats  stat)
6296{
6297 float modPos = 0.0f;
6298 float modNeg = 0.0f;
6299 float factor = 0.0f;
6300
6301 UnitMods const unitMod = static_cast<UnitMods>(UNIT_MOD_STAT_START + AsUnderlyingType(stat));
6302
6303 // includes value from items and enchantments
6304 float modValue = GetFlatModifierValue(unitMod, BASE_VALUE);
6305 if (modValue > 0.f)
6306 modPos += modValue;
6307 else
6308 modNeg += modValue;
6309
6310 modPos += GetTotalAuraModifier(SPELL_AURA_MOD_STAT, [stat](AuraEffect const* aurEff) -> bool
6311 {
6312 if ((aurEff->GetMiscValue() < 0 || aurEff->GetMiscValue() == stat) && aurEff->GetAmount() > 0)
6313 return true;
6314 return false;
6315 });
6316
6317 modNeg += GetTotalAuraModifier(SPELL_AURA_MOD_STAT, [stat](AuraEffect const* aurEff) -> bool
6318 {
6319 if ((aurEff->GetMiscValue() < 0 || aurEff->GetMiscValue() == stat) && aurEff->GetAmount() < 0)
6320 return true;
6321 return false;
6322 });
6323
6324 factor = GetTotalAuraMultiplier(SPELL_AURA_MOD_PERCENT_STAT, [stat](AuraEffect const* aurEff) -> bool
6325 {
6326 if (aurEff->GetMiscValue() == -1 || aurEff->GetMiscValue() == stat)
6327 return true;
6328 return false;
6329 });
6330
6331 factor *= GetTotalAuraMultiplier(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, [stat](AuraEffect const* aurEff) -> bool
6332 {
6333 if (aurEff->GetMiscValue() == -1 || aurEff->GetMiscValue() == stat)
6334 return true;
6335 return false;
6336 });
6337
6338 modPos *= factor;
6339 modNeg *= factor;
6340
6343}
@ SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE
Definition SpellAuraDefines.h:200
@ SPELL_AURA_MOD_STAT
Definition SpellAuraDefines.h:92
@ SPELL_AURA_MOD_PERCENT_STAT
Definition SpellAuraDefines.h:143

References AsUnderlyingType(), BASE_VALUE, AuraEffect::GetAmount(), GetFlatModifierValue(), AuraEffect::GetMiscValue(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), Object::SetFloatValue(), SPELL_AURA_MOD_PERCENT_STAT, SPELL_AURA_MOD_STAT, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_POSSTAT0, and UNIT_MOD_STAT_START.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), AuraEffect::HandleAuraModStat(), and AuraEffect::HandleModTotalPercentStat().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by UpdateUnitMod().

◆ UpdateUnitMod()

void Unit::UpdateUnitMod ( UnitMods  unitMod)
15404{
15405 if (!CanModifyStats())
15406 return;
15407
15408 switch (unitMod)
15409 {
15416 break;
15417
15418 case UNIT_MOD_ARMOR:
15419 UpdateArmor();
15420 break;
15421 case UNIT_MOD_HEALTH:
15423 break;
15424
15425 case UNIT_MOD_MANA:
15426 case UNIT_MOD_RAGE:
15427 case UNIT_MOD_FOCUS:
15428 case UNIT_MOD_ENERGY:
15429 case UNIT_MOD_HAPPINESS:
15430 case UNIT_MOD_RUNE:
15433 break;
15434
15442 break;
15443
15446 break;
15449 break;
15450
15453 break;
15456 break;
15459 break;
15460
15461 default:
15462 break;
15463 }
15464}
@ UNIT_MOD_ARMOR
Definition Unit.h:163
@ UNIT_MOD_ATTACK_POWER
Definition Unit.h:170
@ UNIT_MOD_HEALTH
Definition Unit.h:155
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition Unit.h:171
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15580
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15612
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15641
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition Unit.h:1083
virtual void UpdateMaxHealth()=0

References BASE_ATTACK, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), OFF_ATTACK, RANGED_ATTACK, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by ApplyStatPctModifier(), HandleStatFlatModifier(), SetStatFlatModifier(), and SetStatPctModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21247{
21248 if (!target)
21249 {
21250 return;
21251 }
21252
21254 WorldPacket data;
21255 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21256 target->SendDirectMessage(&data);
21257}
LocaleConstant
Definition Common.h:117
@ CHAT_MSG_MONSTER_WHISPER
Definition SharedDefines.h:3417
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3444
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:265
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:560

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), spell_lich_king_whisper::HandleScript(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21305{
21306 if (!target)
21307 {
21308 return;
21309 }
21310
21311 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21312 if (!bct)
21313 {
21314 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21315 return;
21316 }
21317
21319 WorldPacket data;
21320 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21321 target->SendDirectMessage(&data);
21322}
Definition ObjectMgr.h:434

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21295{
21296 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21297}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _dualWieldMode

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI* Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraFlatModifiersGroup

float Unit::m_auraFlatModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_FLAT_END]
protected

◆ m_auraPctModifiersGroup

float Unit::m_auraPctModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_PCT_END]
protected

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

Referenced by Unit().

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

◆ m_scAuras

AuraList Unit::m_scAuras
protected

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet

The documentation for this class was generated from the following files: